0

独自の登録フォームを作成しようとしていますが、準備済みステートメントに問題があります。

アイデアは、準備されたステートメントを作成してユーザーテーブルに情報を挿入し、そこから生成されたコンテンツからinsert_idを取得して、別のinsertステートメントで使用することです

ここに私の登録スクリプトのバージョンがあります

  <?php

    $returnedId = '';

    include "includes/dbconnect.php";

    $stmt = $db->prepare("INSERT INTO `users`(`Username`, `Email`, `Password`) VALUES (?, ?, ?)");
    $stmt->bind_param('sss', $_POST['username'], $_POST['email'], $_POST['password']);
    $stmt->execute();
    $returnedId = $stmt->insert_id;
    $stmt->close();

    echo $returnedId;

    $allergystmt = $db->prepare("INSERT INTO 'user_allergy' ('user_id', 'allergy_id') VALUES (?, ?)");
    $allergystmt->bind_param('ss', $returnedId, $_POST['check_list']);
    $allergystmt->execute();
    $allergystmt->close();

    header('Location: index.php');

?>

最初の準備されたステートメントは正しく実行され、情報がテーブルに挿入されます。その後、$returnId 変数が正常にエコーされます。スクリプトの次は、私の 2 番目の準備済みステートメントです。実行しようとすると、次のエラーが表示されます。

致命的なエラー: 17 行目の D:\filepath\register.php の非オブジェクトに対するメンバー関数 bind_param() の呼び出し

私の変数が2番目の準備されたステートメントに運ばれていないようです。

4

1 に答える 1

2

2 番目のクエリには構文エラーがあり、に失敗しましたprepare。このようなデータベース障害のエラー処理がないため、後のコードは失敗するだけです。

$allergystmt = $db->prepare("INSERT INTO 'user_allergy' ('user_id', 'allergy_id') VALUES (?, ?)");
                                         ^---         ^--^---    ^-- etc...

'テーブル名とフィールド名に引用符を使用することはできません。'文字列を示します。これらのフィールド/テーブル名は予約語ではないため、引用する必要はまったくありません。

$allergystmt = $db->prepare("INSERT INTO user_allergy (user_id, allergy_id) VALUES (?, ?)");
if (!$allergystmt) { die($dbh->errorInfo()); }

errorInfo() 出力が追加されていることに注意してください。DB 操作が成功したと想定しないでください。常に失敗を想定し、成功をうれしい驚きとして扱います。

于 2014-02-24T16:06:50.893 に答える