準備済みの文を使用してmySQLテーブルから選択しようとしています。選択基準はユーザーフォームの入力ですので、この変数をバインドして準備済みのステートメントを使用しています。以下のコードです:mySQLi Prepared Statementエスケープ文字で選択
$sql_query = "SELECT first_name_id from first_names WHERE first_name = ?";
$stmt = $_SESSION['mysqli']->prepare($sql_query);
$stmt->bind_param('s', $_SESSION['first_name']);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows == '1') {
$stmt->bind_result($_SESSION['first_name_id']);
$stmt->fetch();
} else {
$stmt->close();
$sql_query = "INSERT INTO first_names (first_name) VALUES (?)";
$stmt = $_SESSION['mysqli']->prepare($sql_query);
$stmt->bind_param('s', $_SESSION['first_name']);
$stmt->execute();
$_SESSION['first_name_id'] = $_SESSION['mysqli']->insert_id;
}
$stmt->close();
は明らかに私のコードは、ちょうどFIRST_NAMEが既にfirst_namesテーブルに存在するか否かを判断することです。存在する場合は、対応するID(first_name_id)を返します。それ以外の場合は、新しいfirst_nameがfirst_namesテーブルに挿入され、insert_idが取得されます。
問題は、ユーザーがエスケープ文字( 'Henry's)で名前を入力するときです。名目ではなく、確かに雇用主であることは間違いありません。これが発生すると、コードは実行されません(ログファイルにアクティビティを選択または挿入しません)。したがって、mySQLが変数のエスケープ文字のためにコードを無視しているようです。
この問題を解決するにはどうすればよいですか?私のコードは効率的であり、タスクのために正しいですか?
問題#2。次のコードのようにコードは、その後、別の挿入または更新を続行:
if (empty($_SESSION['personal_id'])) {
$sql_query = "INSERT INTO personal_info (first_name_id, start_timestamp) VALUES (?, NOW())";
} else {
$sql_query = "UPDATE personal_info SET first_name_id = ? WHERE personal_info = '$_SESSION[personal_id]'";
}
$stmt = $_SESSION['mysqli']->prepare($sql_query);
$stmt->bind_param('i', $_SESSION['first_name_id']);
$stmt->execute();
if (empty($_SESSION['personal_id'])) {
$_SESSION['personal_id'] = $_SESSION['mysqli']->insert_id;
}
$stmt->close();
上記のコードの問題は、私はそれがすべてで仕事を得ることができないということです。私はスクリプトの最初の部分といくつかの矛盾があるかどうかはわかりませんが、動作させるためにすべてを試しました。 PHPエラーはなく、このコードのmySQLログファイルには挿入や更新が表示されません。コード内のbind_param行は、スクリプトが死んでいる場所である可能性があります。
ご協力いただければ幸いです。
なぜあなたは、$ _SESSION内部mysqliのオブジェクトを格納していますか? –
開発中により高いレベルのエラー報告を有効にすることをお勧めします。これをスクリプトの先頭に貼り付けます。 'ini_set( 'display_errors'、 'On'); error_reporting(E_ALL); ' – Phil
私はmysqliオブジェクトにセッション変数を使用するなど、セッション変数を使用しています。関数に変数を渡す必要はなく、あるページから別のページに変数を渡す必要もありません。 –