1

次のコード行は、1 つのヒッチを除いて正しく実行されます。変数名をデータベースに出力します。

私はスクリプトの 1 つでこのコードを使用します。

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

このコードは、次をデータベースに出力します。

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

変数の内容ではなく、変数名が出力されることに注意してください。変数の内容を出力するにはどうすればよいですか?

4

5 に答える 5

2

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

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

他のすべての列は変数ではないため、何をしようとしているのかを知るのは困難です。それらを使用しない場合、なぜそれらをまったく参照しないのですか?

あなたのmysql_query電話では、二度と引用しないでください$sql

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

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

于 2012-04-06T21:21:51.723 に答える
2

変数の内容ではなく、変数名が出力されることに注意してください。

これは、insert ステートメントに変数を渡していないためであり、未定義の (?) 定数を渡しているためです。lname、addr など。値を割り当てた変数を渡す必要があります: (仮定) $lname、$addr など。

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

また、テーブル スキーマで定義されたデフォルトの列値を利用する必要があります。これにより、デフォルト値を持つ変数の巨大なリストを渡すことになりません。たとえば、DEFAULT 0item1、item2 のスキーマの一部としてがある場合です。 、 item3 など、次の挿入を簡単に作成できます。

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

データベースは item1、item2 などの列に自動的に 0 を入力します。

cambraca が述べたように、変数をこのようにクエリに直接渡すと、SQL インジェクションのリスクが発生します。クエリを準備する方法を読む必要があります。これにより、mysqli (vs 古い mysql) API の使用も強制されます。または、さらに良いことに、 PDOを読んでください。

于 2012-04-06T21:38:42.153 に答える
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);
于 2012-04-06T21:16:50.137 に答える
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また、値が適切に割り当てられていることを確認してください。

于 2012-04-06T21:17:35.973 に答える
0

\'$first_name\'replace it withを使用するのではなく\"$first_name\"、同じことが他の変数にも続きます。

于 2012-04-06T21:24:55.070 に答える