2

私はいくつかのテキストボックスを作成しようとしていますが、送信時に別のphpが接続されます。たとえば、database.phpの場合、database.phpはテキストボックスの内容をmysqlデータベーステーブルに挿入しますが、どうすればよいかわかりません。 mysqli_queryコードに....私が今持っているのは

mysqli_query($db,"INSERT INTO jliu VALUE(null,$_GET['title'],$_GET['fname'],$_GET['lname'],$_GET['description'])");

もちろん、$_GETは正しく機能しません。私はそれを正しく取得する方法を本当に理解することはできません。

4

7 に答える 7

2

$_GET文字列を変数と連結するには、文字列から抜け出す必要があります。

mysqli_query($db,"INSERT INTO jliu VALUES(null,".$_GET['title'].",".$_GET['fname'].",".$_GET['lname'].",".$_GET['description'].")");

しかし、実際には、上記のギャップのあるSQLインジェクションのセキュリティホールを回避するために、プリペアドステートメントを調べる必要があります。

プリペアドステートメントを使用すると、$_GET変数をクエリのパラメータにバインドすることになります。

$stmt = mysqli_prepare($db,"INSERT INTO jliu VALUES(null, ?, ?, ?, ?");

mysqli_stmt_bind_param($stmt, "s", $_GET['title']); 
...
// and the same for the others

リンクされたマニュアルページには、プリペアドステートメントを実行して結果を返す方法に関する詳細があります。

于 2013-03-26T09:37:53.760 に答える
2

mysql_query()とコンソートは使用しないでください。安全性が低すぎます。PDOを見て、代わりにそれを使用してください。具体的には、PDO :: prepare()とPDOStatement :: execute()がソリューションになります。

于 2013-03-26T09:40:46.710 に答える
2

配列のインデックス値を文字列に挿入するという実際の問題は、2つの方法で解決できます(ヒアドキュメント、sprintfなどを数えるとさらに多くなります)。

中括弧を使用します。

"INSERT INTO jliu VALUE(null, {$_GET['title']}, {$_GET['fname']}, {$_GET['lname']}, {$_GET['description']})"

連結を使用する:

"INSERT INTO jliu VALUE(null, " . $_GET['title'] . ", " . $_GET['fname'] . ", " . $_GET['lname'] . ", " . $_GET['description'] . ")"

ただし、最も重要な問題は、これを行うべきではないということです。あなたのコードを使えば、SQLインジェクションの脆弱性に広くさらされています。

プリペアドステートメントを使用し、そこに値を挿入します。これにより、値をバインドするだけで、実際のクエリ自体は変更されないため、より安全な(そしてわずかにパフォーマンスの高い)クエリが作成されます。コード例:

if ($stmt = $mysqli->prepare("INSERT INTO jliu VALUES (NULL, ?, ?, ?, ?)")) {
    $stmt->bind_param("ssss", $_GET['title'], $_GET['fname'], $_GET['lname'], $_GET['description']);

    $stmt->execute();
}
于 2013-03-26T09:44:00.287 に答える
1

プリペアドステートメントを使用し、変数をプレースホルダーに置き換える必要があります。

http://php.net/manual/de/mysqli.prepare.php

于 2013-03-26T09:38:29.817 に答える
-2

これを試して..

    $title = mysqli_real_escape_string($_GET['title']);
    $fname = mysqli_real_escape_string($_GET['fname']);
    $lname = mysqli_real_escape_string($_GET['lname']);
    $description = mysqli_real_escape_string($_GET['description']);
    $stmt = mysqli_prepare($db,"INSERT INTO jliu VALUES(null,'".$title."','".$fname."','".$lname."','".$description."'");
    mysqli_stmt_execute($stmt);
于 2013-03-26T09:40:14.113 に答える
-2

あなたの質問に答える:

あなたは以下のようなことをするかもしれません。実際には、それは、だけでなく、配列項目の変数を文字列に入れることです$_GET。次のように任意のアレイにアクセスできます。

$str = "some text {$_GET['title']}"

または、オブジェクトを操作する場合の同様のアプローチ:

$str = "some text {$obj->test}"

ただし、SQLクエリを使用している場合は、これはお勧めできません。SQLインジェクションを防ぐために、いくつかの関数を使用して入力をクリアする必要があります。

最も戦略的な方法は、mysqli_real_escape_stringを使用することです。

$str = "some text " . mysqli_real_escape_string($_GET['title'])." ...";

または、より柔軟なプリペアドステートメントを使用できます

于 2013-03-26T09:42:13.703 に答える
-2

こんな感じになります。

$query = sprintf("INSERT INTO jliu VALUE(null,%s,%s,%s,%s)",$_GET['title'],$_GET['fname'],$_GET['lname'],$_GET['description']);
mysqli_query($db,$query);
于 2013-03-26T10:20:42.853 に答える