2010-08-17 5 views
0

Je ne sais pas ce qui se passe, mais il ne veut tout simplement pas fonctionner.INSERT - PHP & SQL Server

Je continue de recevoir cette erreur lorsque je soumets ma forme:

Array ([0] => Array ([0] => 22001 [SQLSTATE] => 22001 [1] => 8152 [code ] => 8152 [2] => [Microsoft] [SQL Server Native Client 10.0] [SQL Server] La chaîne ou les données binaires seraient tronquées. [Message] => [Microsoft] [SQL Server Native Client 10.0] [SQL Server] Les données chaîne ou binaires seraient tronquées.) [1] => Tableau ([0] => 01000 [SQLSTATE] => 01000 [1] => 3621 [code] => 3621 [2] => [Microsoft] [SQL Server Native Client 10.0] [SQL Server] L'instruction a été terminée. [Message] => [Microsoft] [SQL Server Native Client 10.0] [SQL Server] L'instruction a été arrêtée.))

Voici le PHP code:

<?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); 
?> 

Et voici le formulaire 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> 

Quelqu'un peut-il s'il vous plaît me aider? Je ne sais pas quoi faire!

Merci

MISE À JOUR

Voici les définitions:

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 

Désolé, il est pas correctement formaté.

+0

Pouvez-vous également nous montrer la définition de la table?Le SQL pour cela est 'DESCRIBE Suggestions' –

+0

@ JGB146: Vous voulez dire:' sp_help suggestions' ou 'sp_columns suggestions' - DESC/DESCRIBE est Oracle/MySQL –

+1

Terminé J'ai mis à jour la question avec ça :) –

Répondre

0

Je pense que vous avez une erreur dans les colonnes (champs) types, essayez d'insérer un seul caractère, puis la soumission avec succès, essayez d'élargir les champs de type .., à savoir augmenter omble chevalier num ... etc

+0

Wow! Cela fonctionne avec juste 1 caractère! Merci shox! Maintenant, pour essayer d'augmenter le numéro de char –

+0

Vous êtes une légende lol! Merci beaucoup!!!!!! : D –

+0

Vous êtes les bienvenus :) .. – shox

1

L'erreur se produit lorsque vous entrez un champ de texte avec plusieurs caractères. Le message d'erreur "Chaîne ou données binaires serait tronqué" impliquerait que vous avez créé une table dont les colonnes de texte sont limitées à un caractère. Cela se produirait si votre déclaration CREATE disait qu'ils étaient CHAR par opposition à CHAR(somenumber) ou NVARCHAR(somenumber).

Cependant, vous avez un problème plus grave:

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

Vous avez oublié de SQL-échapper à ces chaînes de texte. S'ils contiennent le caractère ' votre requête casse, et n'importe quel attaquant peut exécuter un SQL arbitraire en l'injectant dans la requête. Bientôt votre base de données finira par être endommagée par des liens malveillants, ou pire. Bizarrement, les pilotes sqlsrv ne semblent pas vous donner une fonction d'échappement appropriée, mais il suffit de remplacer ' par '' devrait être suffisant pour SQL Server. Cependant, il vaut mieux éviter le problème en utilisant parameterised queries:

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

Mais merci beaucoup pour le code + conseil, vous l'avez vraiment bousillé pour que je puisse le comprendre. Je ne suis nouveau que pour PHP alors c'est très apprécié. :) –