3

私はPHPの初心者ですが、これは正常ではないと思います。

私のコードは常に次の行でブロックされています:

$insert = 'INSERT INTO boleia VALUES ('.$nick.', '.$data_format.', '.$custo.', '.$dest_origem.', '.$dest_destino.', NULL, '.$matricula.');';

二重引用符を使用し、それらの二重引用符内の変数を使用してみましたが、何もありませんでした。

何か案が?

4

6 に答える 6

4

PHPコードは構文的に正しいですが、値を区切るために引用符を使用していないため、生成されたSQLは正しくありません。

あなたはこれを行うことができます:

$insert = 'INSERT INTO boleia VALUES ("'.$nick.'", "'.$data_format.'", "'.$custo.'", "'.$dest_origem.'", "'.$dest_destino.'", NULL, "'.$matricula.'");';

またはこれ:

$insert = "INSERT INTO boleia VALUES ('".$nick."', '".$data_format."', '".$custo."', '".$dest_origem."', '".$dest_destino."', NULL, '".$matricula."');';

これを行うこともできます:

$insert = "INSERT INTO boleia VALUES ('$nick', '$data_format', '$custo', '$dest_origem', '$dest_destino', NULL, '$matricula');";

ただし、 SQLインジェクションに対して脆弱であるため、その方法は推奨されませ

SQLインジェクションを防ぐ方法は?

たとえば、PostgreSQLを使用しているため、DBに適切な関数を使用して値をエスケープする必要がないようにするには、すべての値にpg_escape_string()を使用する必要があります。

$insert = 'INSERT INTO boleia VALUES ("'.pg_escape_string($nick).'", "'.pg_escape_string($data_format).'", "'.pg_escape_string($custo).'", "'.pg_escape_string($dest_origem).'", "'.pg_escape_string($dest_destino).'", NULL, "'.pg_escape_string($matricula).'");';

もう1つの方法は、pg_prepare()をpg_execute(とともに使用することです。

pg_prepare($dbconn, "my_insert", 'INSERT INTO boleia VALUES ($1, $2, $3, $4, $5, NULL, $6);');
pg_execute($dbconn, "my_insert", array($nick, $data_format, $custo, $dest_origem, $dest_destino, $matricula));

または、pg_query_params()を使用することもできます

pg_query_params($dbconn, 'INSERT INTO boleia VALUES ($1, $2, $3, $4, $5, NULL, $6);',
                array($nick, $data_format, $custo, $dest_origem, $dest_destino, $matricula));
于 2012-12-14T13:06:29.707 に答える
0

挿入クエリの各値は、数値またはNULLでない限り、その前後に引用符が必要です。

$insert = "INSERT INTO boleia VALUES ('$nick', '$data_format', '$custo', '$dest_origem', '$dest_destino', NULL, '$matricula');";

PDOを使用する場合は、引用符やエスケープについて心配する必要はありません。

このPDOチュートリアルの例:

$stmt = $db->prepare("INSERT INTO table(field1,field2,field3) VALUES(:field1,:field2,:field3)");
$stmt->execute(array(':field1' => $field1, ':field2' => $field2, ':field3' => $field3));
$affected_rows = $stmt->rowCount();
于 2012-12-14T13:00:56.710 に答える
-1

クエリに入る文字列値をカプセル化する必要があります。

例えば

$insert = 'INSERT INTO boleia VALUES ("'.$nick.'", "'.$data_format.'", "'.$custo.'", etc.
于 2012-12-14T12:58:08.590 に答える
-1

SQL文字列には二重引用符を使用する方がよいでしょう。後で、文字列を引用符で囲んでいない場所でスポーツをするのが簡単になるからです。

$insert = "INSERT INTO boleia VALUES ('$nick', '$data_format', '$custo', '$dest_origem', '$dest_destino', NULL, '$matricula')";
于 2012-12-14T13:01:11.600 に答える
-1

人々、一般的。元の質問は1行だけです!それはまさにこれです:

$insert = 'INSERT INTO boleia VALUES ('.$nick.', '.$data_format.', '.$custo.', '.$dest_origem.', '.$dest_destino.', NULL, '.$matricula.');';

ここで、エスケープされていない文字列を修正する必要はありません。また、タグに表示されているという理由だけで、彼がPostgreSQLを使用していると仮定する必要もありません。彼には単純なエラーがありました-クエリに文字列のカプセル化がありません。これは、最も単純な形式で、次のように修正されています。

$insert = 'INSERT INTO boleia VALUES (\''.$nick.'\', \''.$data_format.'\', \''.$custo.'\', \''.$dest_origem.'\', \''.$dest_destino.'\', NULL, \''.$matricula.'\');';

以上です!これが行われていない場合に文字列をエスケープする方法として、またはそのような場合に人為的エラーが発生しにくいため二重引用符を使用する方がよい場合に限り、追加情報を追加したい場合に限ります。 、または読むのに適したPDOチュートリアルがある場合は、すべて、彼の問題に対する正確な回答の後の追加情報か、おしゃべりなトピックのいずれかです。

乾杯。

于 2012-12-14T17:01:16.717 に答える
-2
$db = new mysqli( some db data );

$nick = $db->real_escape_string( $nick );
$data_format = $db->real_escape_string( $data_format ); // this is probably not needed
$dest_origem = $db->real_escape_string( $dest_origem );
$dest_destino = $db->real_escape_string( $dest_destino );
$matricula = $db->real_escape_string( $matricula );

$insert = "INSERT INTO boleia VALUES ('$nick', '$data_format', '$custo', '$dest_origem', '$dest_destino', NULL, '$matricula')";

そしてあなたは大丈夫なはずです

于 2012-12-14T13:09:12.297 に答える