INSERT - PHP和SQL服务器(INSERT - PHP & SQL Server)

2019-10-30 04:56发布

我不知道是怎么回事,但它只是不想要的工作。

我不断收到这个错误,当我提出我的表格:

阵列([0] =>数组([0] => 22001 [SQLSTATE] => 22001 [1] => 8152 [代码] => 8152 [2] => [微软] [SQL Server本机客户端10.0] [SQL服务器]字符串或二进制数据将被截断。[消息] => [微软] [SQL Server本机客户端10.0] [SQL服务器]字符串或二进制数据将被截断。)[1] =>数组([0] => 01000 [SQLSTATE] => 01000 [1] => 3621 [代码] => 3621 [2] => [微软] [SQL Server本机客户端10.0] [SQL服务器]该语句已终止。[消息] => [微软] [SQL Server本机客户端10.0] [SQL Server]将语句已终止。))

这里的PHP代码:

    <?php
$who = $_REQUEST["who"];
$what = $_REQUEST["what"];

$serverName = "xxx";   
$uid = "xxx";     
$pwd = "xxx";    
$databaseName = "xxx";   

$connectionInfo = array( "UID"=>$uid,                              
                         "PWD"=>$pwd,                              
                         "Database"=>$databaseName);   

/* Connect using SQL Server Authentication. */    
$conn = sqlsrv_connect( $serverName, $connectionInfo);    

$tsql = "insert into Suggestions (Who, What, Votes) values ('$who','$what','10')";   

/* Execute the query. */    

$stmt = sqlsrv_query( $conn, $tsql);    

if ( $stmt )    
{    
     $something = "Submission successful.";
}     
else     
{    
     $something = "Submission unsuccessful.";
     die( print_r( sqlsrv_errors(), true));    
}
    $output=$something;
/* Free statement and connection resources. */    
sqlsrv_free_stmt( $stmt);    
sqlsrv_close( $conn);
?>

而这里的HTML表单:

<form action="startvoting.php" method="post" id="myform">
          <ol>
            <li>
              <label for="name">Nickname</label>
              <input id="who" name="who" class="text" />
            </li>
            <li>
              <label for="message">What <strong>you</strong> Want</label>
              <textarea id="what" name="what"></textarea>
            </li>
            <li class="buttons">
              <input type="image" src="images/send.gif" class="send" />
              <div class="clr"></div>
            </li>
          </ol>
        </form>

有人可以帮帮我吗? 我不知道该怎么办!

谢谢

UPDATE

下面是定义:

TABLE_QUALIFIER TABLE_OWNER TABLE_NAME  COLUMN_NAME DATA_TYPE   TYPE_NAME   PRECISION   LENGTH  SCALE   RADIX   NULLABLE    REMARKS COLUMN_DEF  SQL_DATA_TYPE   SQL_DATETIME_SUB    CHAR_OCTET_LENGTH   ORDINAL_POSITION    IS_NULLABLE SS_DATA_TYPE
DB_11967_suggestions    dbo Suggestions Who 12  varchar 1   1           1           12      1   1   YES 39
DB_11967_suggestions    dbo Suggestions What    12  varchar 1   1           1           12      1   2   YES 39
DB_11967_suggestions    dbo Suggestions Votes   4   int 10  4   0   10  1           4           3   YES 38

对不起它的格式不正确。

Answer 1:

我认为你必须在列(字段)类型的错误,请尝试成功插入一个字符,然后提交,尽量扩大字段中键入..,即增加焦炭NUM ...等



Answer 2:

错误,当你输入一个以上的字符的文本字段出现。 该错误消息“字符串或二进制数据将被截断”将意味着你已经创建了一个表,它的文本列仅限于一个字符。 如果这会发生CREATE声明中说,他们CHAR ,而不是CHAR(somenumber)NVARCHAR(somenumber)

但是,你一个更大的问题:

$tsql = "insert into Suggestions (Who, What, Votes) values ('$who','$what','10')";   

你忘了SQL-逃避那些文本字符串。 如果它们所包含的'字符查询打破,任何攻击者可以通过将其注入查询执行任意SQL。 很快,你的数据库结束了恶意链接,或者更糟的污损。

奇怪的是,该sqlsrv司机似乎并没有给你一个正确的避开功能,但后来只是更换'''应该是足够的SQL Server。 然而,你就要去使用避免了问题要好得多参数化查询 :

sqlsrv_query(
    $conn,
    'INSERT INTO Suggestions (Who, What, Votes) VALUES (?, ?, 10)',
    array($who,  $what)
);


文章来源: INSERT - PHP & SQL Server