【问题标题】:Error while submitting form data with spaces to sqlsrv from php从php向sqlsrv提交带有空格的表单数据时出错
【发布时间】:2019-09-16 08:27:29
【问题描述】:

我对 php 和 html 编程非常陌生。我有一个用于将信息更新到 SQL DB 的表单。

我可以获得将信息发送到 SQL 的表单,但是一旦我在输入中添加了一个空格或者它们变得太长,它就会停止工作。

我已经到了我想要做的就是发送 $test 变量的地步。我还尝试使用 SP 本身直接将空格发送到 SQL 中,它工作得很好。任何建议表示赞赏。

<div class="form-popup"  id="myForm">
    <form action="../processors/unload.php"  method = "POST" class="form-container" >
        <h1>EDIT BOX</h1>

        <label for="part-id"><B>PART ID</B></label>
        <input type="text" placeholder="enter part ID" name="partID" required>

        <label for="part-id"><B>BOW</B></label>
        <input type="text" placeholder="BOW" name="bow" >

        <label for="partid"><B>TUBE HEIGHT</B></label>
        <input type="text" placeholder="TUBE HEIGHT" name="tube">

        <label for="notes"><B>NOTES</B></label>
        <input type="text" placeholder="notes" name="notes">

        <br>
        <label for="quality"><B>QUALITY</B></label>
        <select name='quality' class='defectDrop'>
            <option value='ok'>OK</option>
            <option value='NOK'>NOK</option>
            <option value='online'>ONLINE</option>
        </select>

        <label for="defect"><b>DEFECT</b></label>                          

        <button type="submit" class="submit-button" id ="boo" >SUBMIT</button>
        <button type="button" class="cancel-button" onclick=hideIt();>CLOSE</button>

    </form>
</div>



<?php
    include('../connect.php');
    $partID = $_POST['partID'];
    $quality = $_POST['quality'];
    $notes = $_POST['notes'];
    $bow = $_POST['bow'];
    $tube = $_POST['tube'];

    $test = "what up";

    $sql = "EXEC dbo.php_test  
                    @part_ID = " .$partID. "
                    , @notes = " .$test. " ";
    echo $sql;
    sqlsrv_query($conn, $sql);
    sqlsrv_close($conn);

    header("location: ../html/test.html");

【问题讨论】:

标签: php html sqlsrv


【解决方案1】:

说明:

不要连接字符串来生成语句。始终使用准备好的语句和参数化查询来防止 SQL 注入。使用 PHP Driver for SQL Server,函数sqlsrv_query() 既可以准备语句,也可以执行语句,并且可以用于执行参数化查询。

错误的原因可能是 T-SQL 语句错误。第二个参数可能是varchar/nvarchar 数据类型,因此您需要将其括在单引号中——'' 表示varchar 数据类型,N'' 表示nvarchar 数据类型。仅将 next 语句用于测试。

$sql = "EXEC dbo.php_test @part_ID = ".$partID.", @notes = '" .$test. "' "; 

解决方案:

作为一种解决方案,您需要使用参数化语句和错误检查来重写代码。

<?php
    include('../connect.php');

    $partID  = $_POST['partID'];
    $quality = $_POST['quality'];
    $notes   = $_POST['notes'];
    $bow     = $_POST['bow'];
    $tube    = $_POST['tube'];

    // Parameterized query   
    $sql = "EXEC dbo.php_test @part_ID = ?, @notes = ?";
    $params = array($partID, $notes);

    // Execution and error checking
    echo $sql;
    $stmt = sqlsrv_query($conn, $sql, $params);
    if ($stmt === false ) {
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
    }

    sqlsrv_free_stmt($stmt);
    sqlsrv_close($conn);

    header("location: ../html/test.html")
?>

【讨论】:

  • 这一切都说得通,而且效果很好。感谢您的帮助!
  • @monty 很高兴为您提供帮助。如果您认为这个或任何其他答案是您问题的最佳解决方案,您可以接受它(只需单击答案旁边的复选标记即可将其从灰色切换为已填充)。
猜你喜欢
  • 2021-10-15
  • 2021-11-07
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
相关资源
最近更新 更多