INSERT - PHP & SQL Server - PullRequest
       0

INSERT - PHP & SQL Server

0 голосов
/ 17 августа 2010

Я не знаю, что происходит, но просто не хочет работать.

Я продолжаю получать эту ошибку, когда я отправляю свою форму:

Array([0] => Массив ([0] => 22001 [SQLSTATE] => 22001 [1] => 8152 [код] => 8152 [2] => [Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Строковые или двоичные данные будут усечены. [Message] => [Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Строковые или двоичные данные будут усечены.) [1] => Массив ([0] => 01000[SQLSTATE] => 01000 [1] => 3621 [код] => 3621 [2] => [Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Оператор был прерван. [Message] => [Microsoft] [Собственный клиент 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>

Может кто-нибудь помочь мне?Я не знаю, что делать!

Спасибо

ОБНОВЛЕНИЕ

Вот определения:

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

Извините, это неправильно отформатировано.

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Ошибка возникает при вводе текстового поля с более чем одним символом.Сообщение об ошибке «String или двоичные данные будут усечены» будет означать, что вы создали таблицу, текстовые столбцы которой ограничены одним символом.Это произошло бы, если бы в вашем 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)
);
0 голосов
/ 17 августа 2010

Я думаю, что у вас есть ошибка в типах столбцов (полей), попробуйте вставить только один символ, затем отправка успешно, попробуйте расширить тип поля .., то есть увеличить номер символа ... и т.д.

...