2010-12-15 62 views
0

J'essaie d'insérer dans une base de données un champ appelé Id_Obj et c'est un VarChar mais lorsque je tente de l'envoyer je reçois une erreur:insert de base de données en PHP retourne la chaîne non définie et remarquez à propos de la colonne inconnue

Unknown Column 'Id_Obj4' in 'field List'

l'insert ressemble à ceci:

while($info=mysql_fetch_Array($data)) 
{ 
    print "name :".$info['Id']." "; 
    $count=$info['Id']; 
} 

$t = "INSERT INTO Table_Faces(Id_Obj,Num_Sides)VALUES("; 
$t = $t."IdObj$count".",".$_GET["ns"]; 
$t = $t.")"; 

mysql_query($t); 

les champs de la base de données sont Id, Id_Obj, Num_Sides.

+4

N'insérez pas le paramètre 'ns' directement à partir du superglobal; toujours [désinfecter vos entrées] (http://bobby-tables.com/). – eykanal

+1

Habituellement, quand j'ai des problèmes de requête, je renvoie la chaîne pour voir à quoi elle ressemble. Dans ce cas, comme Sholsinger mentionné, vous remarquerez l'absence des guillemets simples. – Babiker

Répondre

2

Couple de choses:

  1. Vous voulez vraiment vous assurer que vos valeurs sont escaped
  2. Vous êtes absent sur votre dernier «) » dans la requête
  3. Vos chaînes ont besoin être enveloppé dans citations, sinon il pense que vous êtes en utilisant un nom de table

Votre SQL peut être comme:

$t ="INSERT INTO Table_Faces(Id_Obj,Num_Sides)VALUES('IdObj4','". $_GET["ns"]. "')"; 

En outre, comme un côté si vous connaissez le raccourci:

$t = $t . " something added"; est le même que $t .= " something added"

1

Vous devez envelopper les chaînes avec des guillemets simples dans SQL.

$ns = intval($_GET('ns')); // This should sanitize $ns enough for the db. 
if ($ns > 0) 
{ 
    $t="INSERT INTO Table_Faces(Id_Obj,Num_Sides)VALUES("; 
    $t = $t."'IdObj4'".",".$ns . ")"; 
    mysql_query($t); 
} 

Vous avez également oublié la parenthèse fermante.

J'ai modifié votre code pour être plus résistant à l'injection SQL d'une manière très simple. Si vous avez l'intention de créer également une variable Id_Obj, vous devez utiliser mysql_real_escape_string() pour échapper la valeur à utiliser dans votre instruction SQL.

+1

$ _GET ["ns"] = "''); drop table Table_Faces; -"; // Oups .. – DampeS8N

+0

Alors que j'aurais dû mentionner qu'échapper à ses valeurs est important, j'ai répondu à la question. Mais merci pour votre avertissement d'injection SQL. – sholsinger

0

Lorsque vous êtes dans une situation où votre requête d'insertion est si petit comme ça, pourquoi vous n'utilisez pas tout sur une seule ligne? Il vous sauve de beaucoup de petits problèmes .. Je pense que @Mark a résolu votre problème.