3

PHP で SQLite3 を使用してデータベースにデータを追加しようとしています。準備されたステートメントなしで動作するようになりましたが、今はより安全にしようとしています。私はPDOを使用していません。

これまでのところ、次のコードは機能しません。バインドされた値の代わりに、「:name」と「:email」という単語をデータベースに挿入するだけです。

$smt = $db->prepare("insert into names (name, email) values (':name', ':email')");
$smt->bindValue(':name', $var_name);
$smt->bindValue(':email', $var_email);

$var_name = ($_POST[post_name]);
$var_email = ($_POST[post_email]);

$smt->execute();

そのため、最初は、準備されたステートメントの前後:nameに一重引用符があるためだと思いました。:emailだから私はそれらを取り出しました。フォームを投稿すると、空白のエントリがデータベースに入力されるだけで、$var_nameおよびの値は挿入されません。$var_email

ステートメント実行されていますが、変数が適切にバインドされていないと思います。私は何を間違えましたか?

4

2 に答える 2

6

バインド関数を混乱させることができました。

変数がまだ割り当てられていない場合は、 bindParamを使用する必要があります。
bindValueは既存の値でのみ使用する必要があります

また、エラー報告をオンにする必要があります

于 2013-08-28T10:23:40.150 に答える
4

中間変数は必要ありません。これを行う必要があります。

$smt = $db->prepare("insert into names (name, email) values (':name', ':email')");
$smt->bindValue(':name', $_POST['post_name'], SQLITE3_TEXT);
$smt->bindValue(':email', $_POST['post_email'], SQLITE3_TEXT);

$smt->execute();

値に記載されているように、変数の値を一度に取得するのではSQLite3Stmt::bindValue()なく、即座にバインドされます。したがって、問題は、ステートメントの実行時にその変数が空であることです。SQLite3Stmt::bindParam()execute()


覚えて:

  • 変数の割り当てに括弧を追加する必要はありません: $a = ($b); -> $a = $b;
  • 変数キー名を引用する必要があります。そうしないと、PHP はこの名前の定数を検索しようとし、存在しない場合は警告をスローしますが、存在する場合は誤ったキー値を割り当てます!! $_POST[post_name]->$_POST['post_name']
于 2015-02-20T08:31:44.987 に答える