2010-08-17 8 views
0

Я не знаю, что происходит, но он просто не хочет работать.INSERT - PHP & SQL Server

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

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

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

Спасибо

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 

К сожалению, это не правильно отформатирована.

+0

Можете ли вы показать нам также определение таблицы?SQL для этого является 'DESCRIBE Suggestions' –

+0

@ JGB146: Вы имеете в виду:' sp_help предложения' или 'sp_columns предложения' - DESC/DESCRIBE - это Oracle/MySQL –

+1

Выполнено Я обновил вопрос с ним :) – 2010-08-17 01:50:15

ответ

0

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

+0

Wow! Он работает только с одним символом! Спасибо shox! Теперь, чтобы попытаться увеличить число символов – 2010-08-17 01:51:07

+0

Вы легенда lol! Огромное спасибо!!!!!! : D – 2010-08-17 01:53:39

+0

Добро пожаловать :) .. – shox

1

Ошибка возникает когда вы вводите текстовое поле с более чем одним символом. Сообщение об ошибке «String или двоичные данные будут усечены» означало бы, что вы создали таблицу, текстовые столбцы которой ограничены одним символом. Это произойдет, если в заявлении CREATE указано, что они были CHAR, а не CHAR(somenumber) или NVARCHAR(somenumber).

Однако, у Вас есть большая проблема:

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

вы забыли SQL-ускользает эти строки текста. Если они содержат символ ', ваш запрос прерывается, и любой злоумышленник может выполнить произвольный SQL, введя его в запрос. Довольно скоро ваша база данных заканчивается вредоносными ссылками или, что еще хуже.

Необычно, драйверы sqlsrv, похоже, не дают вам правильной функции экранирования, но для замены SQL Server достаточно просто заменить ' на ''. Тем не менее, вам намного лучше избежать вопроса, используя parameterised queries:

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

Но спасибо вам за код + совет, вы действительно заманили его, чтобы я мог это понять. Я новичок в php, поэтому его очень ценят. :) – 2010-08-17 02:26:30