2009-08-02 17 views
15

私はその列とテーブル名(単純な文字列)に挿入される列の名前と値の連想配列に基づいて準備されたINSERT文を生成する関数があります:私の問題は、その$であるMysqli Prepare Statement - Falseを返しますが、なぜですか?

function insert ($param, $table) { 
     $sqlString = "INSERT INTO $table (".implode(', ',array_keys($param)).') VALUES ('.str_repeat('?, ', (count($param) - 1)).'?)'; 
     if ($statement = $this->conn->prepare($sqlString)): 
      $parameters = array_merge(array($this->bindParams($param), $param)); 
      call_user_func_array(array($statement, 'bind_param', $parameters)); 
      if (!$statement->execute()): 
       die('Error! '.$statement->error()); 
      endif; 
      $statement->close(); 
      return true; 
     else: 
      die("Could Not Run Statement"); 
     endif; 
    } 

をthis-> conn-> prepare(これはクラスの一部ですが、connは問題なしで動作するNEW mysqliオブジェクトです)はfalseを返しますが、なぜ私に理由がないのですか?ここで

は、準備文のために構築されますサンプルの$ SQLSTRINGです:

INSERT INTO students (PhoneNumber, FirstName, MiddleInit, LastName, Email, Password, SignupType, Active, SignupDate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) 

誰もがこのパラメータ化ステートメントを使用して問題を見ることができますか?準備関数がfalseを返す理由は何ですか?

+2

エラーメッセージが表示されますか(http://php.net/manual/ja/mysqli.error.phpではprepareがfalseを返します)。はいの場合、それは何ですか? –

+2

データベースで実際のINSERT文を実行しようとしましたが、正しいSQLがあることを確認しましたか? – DOK

+1

mysqli_report(MYSQLI_REPORT_ALL)を有効にして、何が起こっているのかをよく理解しています。フィールド名の1つが間違っていることが判明しました。prepare()は例外をスローしますが、 –

答えて

41

私は解決策をこの回答にコピーしていますので、これをアップアップにすることができます。それ以外の場合は「未回答の質問」に永遠に表示されます。私はこの回答をCWにマーキングしているので、何のポイントも得られません。

@Andrew E.は言う:

私はちょうど は何が起こっていたかのより良い理解を得る に mysqli_report(MYSQLI_REPORT_ALL)オン - あなた - が私 フィールド名のいずれかが間違っていたことが判明'd はprepare()が 例外をスローすると思いますが、それは黙って失敗します。

+0

@ P5Coder、PHP、およびMySQLは、試行された他のすべてのソリューションを除いて、最悪のソリューションです。 :-) –

+0

@BillKarwinあなたは決して他の高水準の言語やデータベースを試してはいけません。 PHPは間違いなく最も設計言語であり、MySQLはデフォルトエンジンを使用してACIDに準拠していません。 –

+1

@vee_ess、デフォルトのエンジンは、2010年にリリースされたMySQL 5.5以降のInnoDBです.NinoDBは他のほとんどのデータベースと同様にACIDをサポートしています。 –

関連する問題