6

テーブルに挿入する必要がある 70/80 フィールド フォームがあるため、1 つの巨大な挿入ステートメントを手動で作成する代わりに、最初にフォームの入力の名前からデータベースにテーブルを作成しました。使用するコードは次のとおりです。テーブルを作成/変更する

function createTable($array, $memberMysqli)
{
   foreach ($array as $key => $value)
   {
            //echo "<p>Key: ".$key." => Value: ".$value . "</p>";
            $query = "ALTER TABLE questionnaire ADD ".$key."  text";

            if($stmt = $memberMysqli->prepare($query))
            {
                $success = $stmt->execute();
            }
   }
         echo "<h1>Array count: ". count($array) ."</h1>" ;
}

これは正常に機能し、テーブルを希望どおりに変更しました。これを行うためにフォームの値を挿入するには、行の ID を保存する基本的な 1 つのフィールドを挿入し、その行を更新するすべてのポスト変数をループさせます。そのための私のコードは次のとおりです。

$stmt = $memberMysqli->prepare("INSERT INTO questionnaire(userid) VALUES (?)");

$stmt->bind_param('s', $_POST['userid']);
$stmt->execute();
$rowid = $stmt->insert_id;
$stmt->close();

$memberMysqli->autocommit(FALSE);

function updateColumn($memberMysqli, $query, $uid, $value) 
{
    if ($value) 
    {
        $stmt = $memberMysqli->prepare($query);
        //Throws bind param error here
        $stmt->bind_param("ss", $value, $uid);
        $stmt->execute();
    }
}

function loopInputs($array, $memberMysqli, $rowid)
{
     foreach ($array as $key => $formvalue)
     {
        var_dump($key);
        updateColumn($memberMysqli, "UPDATE questionnaire SET $key = ? WHERE id = ?", $rowid, $formvalue);
     }
}

loopInputs($_POST, $memberMysqli, $rowid);

$memberMysqli->commit();
$memberMysqli->close();

これにより bind param エラーがスローされますが、その理由はわかりません。

4

1 に答える 1

7

ああ、標準的な答えを試してみましょう。

Call to a member function(またはexpects parameter 1 to be mysqli_result, boolean given手続き型の場合) はエラー自体ではなく、他の問題の単なる症状です。
このまさにエラー メッセージは、オブジェクトが作成されるべき場所に作成されなかったことを意味します。

$stmtそのため、オブジェクトの作成に問題がありました。
ほとんどの場合、クエリに問題があります。したがって、そのエラーを追跡する必要があります。

明示的に尋ねられない限り、Mysqli は何が起こっているのかを教えてくれません。したがって、サーバーと対話するすべての mysqli 関数の結果を常にチェックする必要があり、結果が FALSE の場合は check$mysqli->errorです。

また、mysqli エラー メッセージを PHP エラーに変換して、サイト全体のエラー レポート設定に従って処理することも非常に重要です。

アプリケーション コード全体で mysqli_query() をヘルパー クラスにカプセル化せずに使用している場合trigger_error()は、エラーが発生したファイルと行番号も表示されるため、PHP エラーを発生させる良い方法です。

したがって、すべてのprepare()、 execute() 、およびquery()呼び出しは、次のように記述する必要があります。

$stmt = $mysqli->prepare($query) or trigger_error($mysqli->error."[$query]");

または手続き型のスタイルで

$res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]");

それ
以降、オブジェクトが作成されなかった理由が通知されます。(このor構文に興味がある場合は、ここで説明しました) 視覚的に検査して別の環境でテストできるように、クエリもエラー メッセージに含まれていることに注意してください。

ただし、クエリを何らかのクラスにカプセル化する場合、トリガーエラーからのファイルと行は、特定の問題を引き起こしたアプリケーションコードではなく、呼び出し自体を指すため、まったく役に立ちません。したがって、カプセル化された mysqli コマンドを実行する場合は、別の方法を使用する必要があります。

$result = $mysqli->query($sql);
if (!$result) {
    throw new Exception($mysqli->error." [$query]");
}

as Exception はスタック トレースを提供し、エラーのあるクエリが呼び出された場所を特定します。

PHP エラー全般を表示できる必要があることに注意してください。ライブ サイトではエラー ログを確認する必要があるため、設定を変更する必要があります。

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);

一方、ローカルの開発サーバーでは、画面上でエラーを表示しても問題ありません。

error_reporting(E_ALL);
ini_set('display_errors',1);

もちろん、ステートメントの前にエラー抑制演算子 (@) を使用しないでください。

于 2013-03-16T08:28:19.973 に答える