0

私は.phpとSQLで遊んでいて、何かをテストしようとしています。変数をテーブルに格納するのは非常に簡単なことですが、何らかの理由で現在は機能していません。

これが私が持っているテーブルです:

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| v1    | varchar(255) | YES  |     | NULL    |       | 
| v2    | varchar(255) | YES  |     | NULL    |       | 
| v3    | varchar(255) | YES  |     | NULL    |       | 
| v4    | varchar(255) | YES  |     | NULL    |       | 
| v5    | varchar(255) | YES  |     | NULL    |       | 
| v6    | varchar(255) | YES  |     | NULL    |       | 
| v7    | varchar(255) | YES  |     | NULL    |       | 
| v8    | varchar(255) | YES  |     | NULL    |       | 
| v9    | varchar(255) | YES  |     | NULL    |       | 
| v10   | varchar(255) | YES  |     | NULL    |       | 
+-------+--------------+------+-----+---------+-------+

私は次のようにテーブルにアクセスします:

$result = mysql_query("INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES ($field0, $field1, $field2, $field3, $field4, $field5, $field6, $field7, $field8, $field9)");

これを行うことで、URLから変数を取得します。

$field0 = $_GET['field0'];
$field1 = $_GET['field1'];
$field2 = $_GET['field2']; 
$field3 = $_GET['field3'];
$field4 = $_GET['field4'];
$field5 = $_GET['field5'];
$field6 = $_GET['field6'];
$field7 = $_GET['field7']; 
$field8 = $_GET['field8'];
$field9 = $_GET['field9'];

そして最後に、私のURLは次のとおりです。

http://mywebsite.ca/anapplication?field0=YES&field1=GOOD&field2=GOOD&field3=GOOD&field4=YES&field5=GOOD&field6=GOOD&field7=GOOD&field8=A&field9=&

不明な列「YES」(最初のパラメーター)があるというエラーメッセージが表示されます。文字列の代わりに数字を使用して同じURLを渡しましたが、驚いたことに、すべてが機能しました。

私は.phpやSQLの経験があまりないので、ここに投稿した内容をざっと見てみるための新しい目が探しています。

4

6 に答える 6

5

値を一重引用符で囲む必要があると思います。そうすれば、mysqlはそれらを整数ではなく文字列として扱います。これが、文字列ではなく、数字のみを渡すことが機能する理由です。

それで、

$result = mysql_query("INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES ('$field0', '$field1', '$field2', '$field3', '$field4', '$field5', '$field6', '$field7', '$field8', '$field9')");

それをクリアする必要があります。

また、これがWebフォームまたはその他の外部ソースからのものである場合は、mysql_real_escape_string()などを使用してサニタイズしてください。

于 2012-08-07T22:12:16.053 に答える
2

おそらく、古い mysql_ ライブラリの代わりにmysqliまたはPDOを確認する必要がありますが、それ以外の問題は、有効な SQL を生成していないことです。

INSERT INTO form2 (v1, v2 ...) VALUES(GOOD0, GOOD1 ...)

は有効な SQL ではありません。値を文字列として扱うには、値を一重引用符または二重引用符で囲む必要があります。

INSERT INTO form2 (v1, v2 ...) VALUES('GOOD0', 'GOOD1' ...)

送信された文字列には引用符が含まれている可能性があるため (したがって、生成された SQL が無効になったり、実行したくないタスクが実行されたりする可能性があります)、常に準備済みステートメントを使用するか、使用できない場合は、ライブラリのエスケープ関数を使用して文字列を適切にエスケープする必要があります。 ( mysql_real_escape_stringなど)。

于 2012-08-07T22:16:28.573 に答える
2

私がすでにコメントしたように:

mysql_*新しいコードに関数を使用しないでください。それらはもはや保守されておらず、コミュニティは非推奨プロセスを開始しています。赤いボックスが見えますか? 代わりに、準備済みステートメントについて学び、 PDOまたはMySQLiのいずれかを使用する必要があります。決められない場合は、この記事を参考にしてください。学習したい場合は、ここに良い PDO チュートリアルがあります。

プリペアド ステートメントを使用すると、そこにある厄介な SQL インジェクションの脆弱性も解消されます。

PDO を使用するには、次のようにします。

$pdo= new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare('INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES (:v1, :v2, :v3, :v4, :v5, :v6, :v7, :v8, :v9, v10');
$stmt->execute(array(
    ':v1'  => $_GET['field0'],
    ':v2'  => $_GET['field1'],
    ':v3'  => $_GET['field2'],
    ':v4'  => $_GET['field3'],
    ':v5'  => $_GET['field4'],
    ':v6'  => $_GET['field5'],
    ':v7'  => $_GET['field6'],
    ':v8'  => $_GET['field7'],
    ':v9'  => $_GET['field8'],
    ':v10' => $_GET['field9'],
));

元の質問については、値の周りの引用符を忘れただけです:-)

于 2012-08-07T22:25:41.620 に答える
0

わかりました。PHP には、プログラムを実行している変数やステップを監視するためのデバッガー モードがありません。そのため、PHP でそのようなタイプの奇妙なエラーやバグを見つけた場合はいつでも、初心者レベルでデータベースに直接値を挿入しないでください。まず、すべての質問で言及したようにクエリ文字列から値を取得し、クエリを作成して次のような変数に割り当てます

$query ="INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES ($field0, $field1, $field2, $field3, $field4, $field5, $field6, $field7, $field8, $field9)";

echo $query;次に、ブラウザでそのクエリをエコーし​​、最初にSQLYog または PHPMyAdminで実行する必要があります。正常に動作する場合は、PHP コーディングで残りの作業を行います。初心者にはとてもいい練習になると思います。

ありがとうございました。

于 2012-08-07T22:20:01.990 に答える
0

実際に $field0 を v1 フィールドに挿入するのではなく、これらの変数が表す値を実際に入力しようとしているようです。したがって、文字列を単一引用符で連結する必要があります。PHP を使用してからしばらく経ちましたが、それは "." を使用する必要があります。私の記憶が正しければ、次のようなものかもしれません。

$result = mysql_query("INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES ('" . $field0 . "', '" . $field1 . "', '" . $field2 . "', '" . $field3 . "', '" . $field4 . "', '" . $field5 . "', '" . $field6 . "', '" . $field7 . "', '" . $field8 . "', '" . $field9 .  "')");
于 2012-08-07T22:17:45.047 に答える
0

私の推測では、どういうわけかPHPは「YES」がブール値であると想定しています(TRUEまたはFALSE、または0と1のように、0はNOに等しく、1はYESに等しい)。

最初の方法は、「YES」という単語全体を使用するのではなく、「y」または「n」を使用することです。多くのデータベースが、yes または no 型のデータに CHAR(1) 列を使用していることに気付きました。これは、単に「y」または「n」をフィールドに格納します。

それができない場合、文字列の挿入を保証する最善の方法は、SQL INSERT の前に PHP に文字列を文字列に変換させることです。

残念ながら、PHP は BOOLANS から STRING への変換を strval() ほど簡単には行いません。ただし、できることは、値がTRUEかFALSEかを確認し、それに応じて値を設定することです。

<?php
$field0 = ($_GET['field0'] == "YES") : "YES" : "NO"; // if equals to YES set to (string) YES; else set to (string) NO.

http://php.net/manual/en/language.types.boolean.php

于 2012-08-07T22:22:07.603 に答える