简体   繁体   English

插入-PHP和SQL Server

[英]INSERT - PHP & SQL Server

I don't know what is going on, but it just doesn't want to work. 我不知道发生了什么,但是它只是不想工作。

I keep getting this error when I submit my form: 提交表单时,我不断收到此错误:

Array ( [0] => Array ( [0] => 22001 [SQLSTATE] => 22001 [1] => 8152 [code] => 8152 [2] => [Microsoft][SQL Server Native Client 10.0][SQL Server]String or binary data would be truncated. [message] => [Microsoft][SQL Server Native Client 10.0][SQL Server]String or binary data would be truncated. ) [1] => Array ( [0] => 01000 [SQLSTATE] => 01000 [1] => 3621 [code] => 3621 [2] => [Microsoft][SQL Server Native Client 10.0][SQL Server]The statement has been terminated. [message] => [Microsoft][SQL Server Native Client 10.0][SQL Server]The statement has been terminated. ) ) 数组([0] =>数组([0] => 22001 [SQLSTATE] => 22001 [1] => 8152 [代码] => 8152 [2] => [Microsoft] [SQL Server Native Client 10.0] [SQL Server]字符串或二进制数据将被截断。[消息] => [Microsoft] [SQL Server Native Client 10.0] [SQL Server] String或二进制数据将被截断。)[1] =>数组([0] => 01000 [SQLSTATE] => 01000 [1] => 3621 [code] => 3621 [2] => [Microsoft] [SQL Server Native Client 10.0] [SQL Server]该语句已终止。[消息] => [ Microsoft] [SQL Server Native Client 10.0] [SQL Server]该语句已终止。

Here's the PHP Code: 这是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);
?>

And here's the HTML Form: 这是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>

Can someone please help me? 有人可以帮帮我吗? I don't know what to do! 我不知道该怎么办!

Thank you 谢谢

UPDATE 更新

Here is the definitions: 这里是定义:

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

Sorry it's not properly formatted. 抱歉,格式不正确。

The error occurs when you input a text field with more than one character. 当您输入包含多个字符的文本字段时,将发生错误。 The error message “String or binary data would be truncated” would imply that you have created a table whose text columns are limited to one character. 错误消息“字符串或二进制数据将被截断”表示您创建了一个表,其文本列限制为一个字符。 That would happen if your CREATE statement said they were CHAR as opposed to CHAR(somenumber) or NVARCHAR(somenumber) . 如果您的CREATE语句表示它们是CHAR而不是CHAR(somenumber)NVARCHAR(somenumber)则会发生这种情况。

However, you've a bigger problem: 但是,您有一个更大的问题:

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

You've forgotten to SQL-escape those text strings. 您忘记了SQL转义那些文本字符串。 If they contain the ' character your query breaks, and any attacker can execute arbitrary SQL by injecting it into the query. 如果它们包含'字符,则查询将中断,并且任何攻击者都可以通过将其注入查询中来执行任意SQL。 Pretty soon your database ends up defaced with malware links, or worse. 很快,您的数据库最终会遭到恶意软件链接的破坏,甚至更糟。

Bizarrely, the sqlsrv drivers don't seem to give you a proper escaping function, but then just replacing ' with '' should be enough for SQL Server. 奇怪的是,该sqlsrv司机似乎并没有给你一个正确的避开功能,但后来只是更换'''应该是足够的SQL Server。 However, you're much better off avoiding the issue by using parameterised queries : 但是,最好使用参数化查询来避免此问题:

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

我认为您在column(fields)类型中有错误,尝试仅插入一个字符,然后提交成功,尝试扩展字段类型..即增加char num ... etc

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM