2012-04-06 15 views
1

私は、1つのヒッチを除いて正しく実行される以下のコード行を持っています。変数名がデータベースに出力されます。このコードは、データベースへのfollowin印刷し変数を取得するPHPデータベース

$con = mysql_connect("MyServer","MyDB","myPwd"); 
mysql_select_db("MyDB", $con); 
$sql = "INSERT INTO `MyDB`.`Shipping` (`ID`, `FIRSTNAME`, `LASTNAME`, `ADDRESS1`, `ADDRESS2`, `CITY`, `STATE`, `ZIP`, `ORDERNUMBER`, `SHIPPINGTYPE`, `item1`, `item2`, `item3`, `item4`, `item5`, `item6`, `item7`, `item8`, `item9`, `item10`) VALUES (NULL, \'$first_name\', \'lname\', \'addr\', \'\', \'city\', \'state\', \'zip\', \'ordernum\', \'\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\');"; 
mysql_query("$sql"); 
mysql_close($con); 

私は私のscripsの一つで、このコードを使用

$first_name lname addr  city state zip 0  0 0 0 0 0 0 0 0 0 0 

お知らせその変数名、変数のない内容印刷されます。可変内容を印刷するにはどうしたらいいですか?

+2

[SQLインジェクション](http://en.wikipedia.org/wiki/SQL_injection)にご注意ください – cambraca

答えて

2

お知らせ

です。 lname、addrなど。値を代入した変数を$ lname、$ addrなどに渡す必要があります。

また、ID列にNULLを渡す必要はありません。 auto_incrementに設定されている場合、データベースによってこの値が作成されます。

また、テーブルスキーマで定義されたデフォルトの列値を利用する必要があります。たとえば、DEFAULT 0がデフォルト値の一部である場合など、デフォルト値を持つ膨大な変数リストを渡すことはありません。 ITEM1、ITEM2、ITEM3などのスキーマは、単に次の挿入を行うことができます。

$sql = 
"INSERT INTO `MyDB`.`Shipping` (`FIRSTNAME`, `LASTNAME`, `ADDRESS1`, `CITY`, `STATE`, `ZIP`, `ORDERNUMBER`) VALUES ('$first_name', '$lname', '$addr', '$city', '$state', '$zip', '$ordernum');"; 

データベースは自動的に0にITEM1、ITEM2、などの列に移入されます。

cambracaが述べているように、このように変数にクエリを直接渡すと、リスクはSQL injectionになります。どのようにprepareクエリを読んで、mysqli(旧mysql)APIも使用する必要があります。それ以上には、PDOを読んでください。

0

私はPHPの文字列でインライン変数を使用しないと思いますが、必要がないときはエスケープしています。これを試してみてください:

$con = mysql_connect("MyServer","MyDB","myPwd"); 
mysql_select_db("MyDB", $con); 
$sql = "INSERT INTO `MyDB`.`Shipping` (`ID`, `FIRSTNAME`, `LASTNAME`, `ADDRESS1`, `ADDRESS2`, `CITY`, `STATE`, `ZIP`, `ORDERNUMBER`, `SHIPPINGTYPE`, `item1`, `item2`, `item3`, `item4`, `item5`, `item6`, `item7`, `item8`, `item9`, `item10`) VALUES (NULL, '".$first_name."', 'lname', 'addr', '', 'city', 'state', 'zip', 'ordernum', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');"; 
mysql_query($sql); 
mysql_close($con); 
+0

'' '、' ".lname。" '、' ".addr。" ''hmm :):thinker : – hjpotter92

+0

既に修正済み... – Philipp

+0

補間の代わりに連結を使用しても差はありません。 – cantlin

0

変更挿入ステートメントに:

$sql = "INSERT INTO `MyDB`.`Shipping` 
    (`ID`, `FIRSTNAME`, `LASTNAME`, `ADDRESS1`, `ADDRESS2`, `CITY`, 
    `STATE`, `ZIP`, `ORDERNUMBER`, `SHIPPINGTYPE`, `item1`, `item2`, 
    `item3`, `item4`, `item5`, `item6`, `item7`, `item8`, `item9`, `item10`) 
    VALUES (NULL, '{$first_name}', 'lname', 'addr', '', 'city', 'state', 
    'zip', 'ordernum', '', '0', '0', '0', '0', '0', '0', '0', 
    '0', '0', '0');"; 

はまた、あなたの$first_nameが適切に値を割り当てられていることを確認します。

+0

中括弧はまったく違いがありません。 – cantlin

2

1つでは、引用の問題があります。あなたは二重引用符を持っていて、一重引用符をエスケープしたようです。文字列が二重引用符で囲まれていると、一重引用符をエスケープしないでください。

$first_nameの値が機能するはずです。これは正確なコードですか?なぜなら、全体を一重引用符で囲むと、記述している出力が作成されるからです。

他のすべての列は変数ではないので、あなたが何をしようとしているのかを知ることは難しいです。あなたがそれらを使用しようとしないなら、なぜそれらを全く参照しないのですか?

mysql_query電話では、$sqlをもう一度引用しないでください。

最後に、mysql_error()にエラーがないかチェックしてください。データベース内で古いものを見ている可能性があり、コードがまったく機能していない可能性があります。

PDOを使用することを検討してください。これは、ネイティブのmysql_ *インタフェースよりも、プレースホルダ、より良いセキュリティ、およびより良いデバッグをサポートしています。

+0

合理的です。 –

0

\'$first_name\'を使用するのではなく、\"$first_name\"と置き換えてください。他の変数も同様です。 (?)あなたはむしろあなたは未定義の定数を渡している、insert文に変数を渡していないので、変数名、変数のない内容が印刷されていることを

関連する問題