23

列名とその列に挿入される値の連想配列とテーブル名 (単純な文字列) に基づいて、準備された INSERT ステートメントを生成する関数があります。

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 は新しい mysqli オブジェクトであり、問​​題なく動作します) は false を返しますが、その理由はわかりません!

以下は、prepare ステートメント用に作成される $sqlString のサンプルです。

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

このパラメータ化されたステートメントに問題がある人はいますか? prepare 関数が false を返す理由はありますか?

4

2 に答える 2

70

解決策をこの回答にコピーしているので、これに賛成票を投じることができます。そうしないと、質問は「未回答の質問」に永久に表示されます。この回答を CW とマークしているので、ポイントを獲得できません。

@Andrew E. さんのコメント:

mysqli_report(MYSQLI_REPORT_ALL)何が起こっているのかをよりよく理解するためにオンにし ました -フィールド名の 1 つが正しくないことが判明しました - 例外がスローされると思われるかもしれませんprepare()が、黙って失敗します。

于 2009-08-02T23:42:23.700 に答える
-1

これらが、この問題が発生した主な理由です。

  • クエリのエラー
  • 2 つのクエリを同時に実行しようとしています (コマンドが同期していません)

まず正確な原因を知る必要があります。そのために、次のコードを追加します。

if ($stmt === FALSE) {
   die ("Error: " . $mysqli->error);
}

2 つのクエリを同時に実行している場合は、最初のステートメントの値を格納すると問題が解決します。

$first_stmt->store_result()
于 2021-06-22T05:35:23.080 に答える