準備済みステートメントを使用してデータベースにテーブルを挿入および更新する際に問題が発生する

StackOverflow https://stackoverflow.com/questions/652960

  •  19-08-2019
  •  | 
  •  

質問

PHP5には非常に新しく、まだいくつか問題があります。次のようにコードを挿入/更新しようとしている準備済みステートメントで選択する方法を見つけました

function input_lab_results($name, $image, $descrip) {
    $query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";

    if($stmt = $this->conn->prepare($query)){
        $stmt->bind_param('sssiidd', $name, $image, $descrip, 0, 0, date("Ymd"), date("Ymd"));
        $stmt->execute();
        die();
    } else{
        die($this->conn->error);
    }
}

エラーが発生しています

  

致命的なエラー:43行目のhtml / classes / mySQL.phpを参照してパラメーター4を渡すことはできません

どんなヘルプ/リファレンスも歓迎します。ありがとう。


誰もがPDOを使用していることについて言及していますが、良いチュートリアルや例はありますか?

役に立ちましたか?

解決 2

変更しました

function input_lab_results($name, $image, $descrip) {
    $query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";

    if($stmt = $this->conn->prepare($query)){
        $stmt->bind_param('sssdd', $name, $image, $descrip, date("Ymd"), date("Ymd"));
        $stmt->execute();
        die();
    } else{
        die($this->conn->error);
    }
}

基本的に、??を読んでいた場所を変更しました。クエリの整数を0にするには、バインドしませんでした。

他のヒント

問題ではない$descripではありません。それは0です(パラメーター4 <!> amp; 5)。解決策は整数ではなく変数を渡すことです:

 `$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";`

    $pat_doctor = 0;
    $pat_resident = 0;

    if($stmt = $this->conn->prepare($query)){
            $stmt->bind_param('sssiidd', $name, $image, $descrip, $pat_doctor, $pat_resident, date("Ymd"), date("Ymd"));`

mysqli_bind_paramは、引数を参照として必要としているため、値をコピーするのではなく、メモリ内の保存場所を探します。これは、そのイメージなど、sqlステートメントにバインドしたいもののいくつかがおそらく十分に大きいため、余分なコピーが走り回らないようにするために理にかなっています。文字列などのリテラルは、参照によってアクセスできません。参照: http://us.php.net/references

iは、SQLステートメントに0をハードコーディングすることを推奨しません。コードを不必要に混乱させるからです。

ところで、PDOを提案させてください。その構文は非常に賢明です。

bind_paramは使用しないでください-これは非常に直感的でエラーが発生しやすいインターフェイスです。これは、基本となるC-apiのレガシーです。 bind_value またはそれ以上を使用します-値の配列を PDOStatement->execute への引数。例:

$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
if ($stmt = $this->conn->prepare($query)) {
  $stmt->execute(array($name, $image, $descrip, date("Ymd"), date("Ymd")));
  die();
} else {
  die($this->conn->error);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top