2012-01-12 13 views
1

準備済みの文を使用して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行は、スクリプトが死んでいる場所である可能性があります。

ご協力いただければ幸いです。

+1

なぜあなたは、$ _SESSION内部mysqliのオブジェクトを格納していますか? –

+0

開発中により高いレベルのエラー報告を有効にすることをお勧めします。これをスクリプトの先頭に貼り付けます。 'ini_set( 'display_errors'、 'On'); error_reporting(E_ALL); ' – Phil

+0

私はmysqliオブジェクトにセッション変数を使用するなど、セッション変数を使用しています。関数に変数を渡す必要はなく、あるページから別のページに変数を渡す必要もありません。 –

答えて

-1

ユーザ入力を検証してエスケープしてからdbに送信する必要があります。

チェックアウトこのmysql-real-escape-string()

+2

準備文とバインドパラメータを使用すると、DB固有のエスケープ機構の必要性がなくなります – Phil

+1

@DavidChan Philのコメントが十分ではないように、OPがはっきりしている間はmysql_real_escape_string() mysqliを使用します。 –

+0

はい私は、準備されたステートメントとバインドパラメータを使用するという考えは、エスケープメカニズムの必要性を完全に避けるためだと考えました.... –

関連する問題