どのように動的にmysqliのプリペアドステートメントでのparamsをバインドするには?

MeesEgberts:

私は私のプロジェクトのための関数を作成しようとしています。私はそれがすべてのチェック機能を処理したいと思います。あなたが行がそのメールアドレスに存在するかどうかをチェックしてデータベース内の行を挿入を開始する前に、私はそれを意味することです。

この機能を使用するには、動的にそれは柔軟である必要があります。だから私は、配列内の私の変数を入れなかったが、mysqli_stmt_bind_param配列を扱うことができません。解決策として、私は作ってみましたforeachループを。

クエリ:

$sql = "SELECT users_id, users_email FROM users WHERE users_id = ? AND users_email = ?;";

関数を呼び出します:

check_database($sql, array($id, $mail), array("s", "s"), $location);

私の本来の機能:

function check_database($sql, $variables, $types, $location)
{
    require $_SERVER['DOCUMENT_ROOT'] . '/includes/db/db.inc.php';
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql)) {
        header("Location: " . $location . "?error=sqlerror");
        exit();
    } else {
        mysqli_stmt_bind_param($stmt, $types, $variables);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);
        if (!$row = mysqli_fetch_assoc($result)) {
            return true;
        }
    }
}

私は追加foreachmysqli_stmt_bind_param、このように:

foreach ($types as $index => $type) {
    mysqli_stmt_bind_param($stmt, $type, $variables[$index]);
}

これは私にエラーを与え、私はそれを解決する方法がわからない:(

警告:mysqli_stmt_bind_param():変数の数は、プリペアドステートメント内のパラメータの数と一致しません

あなたの常識:

あなたは非常に正しい軌道に乗っています!このような関数はmysqliのを使用して、すべてのPHPプログラマーのための日常の仲間であってもよいが、妙に、ほんの数史上1を作成するためのアイデアを持っている必要があります。

私はかつて、まったく同じ考えを持っていたし、実施してきましたmysqliのヘルパー関数自分のを:

function prepared_query($mysqli, $sql, $params, $types = "")
{
    $types = $types ?: str_repeat("s", count($params));
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param($types, ...$params);
    $stmt->execute();
    return $stmt;
}

あなたのアプローチからの主な違い

  • 接続にのみ行われる一回あなたのコードは、クエリを実行するたびに接続し、これは何をすべきか、絶対ではありません
  • それだけではなく、任意のクエリに使用SELECTすることができます。あなたは記事の例のセクションの下で機能の汎用性を確認することができます
  • ほとんどの時間は、あなたがタイプのために気にしないようなタイプはオプションで作られました
  • 奇妙な$の場所の変数をなし。正直なところ、どのようなHTTPのものは、データベース操作の一部であってはなりません!あなたは適切にエラーに対処する方法好奇心旺盛であれば、ここに私の他の記事でPHPのエラー報告

あなたの例のクエリで、それは次のように使用することができ

$check = prepared_query($sql, [$id, $mail])->get_result()->fetch_row();

あなたは明確な機能をしたい場合は、あなたにもそれを作ることができます

function check_database($mysqli, $sql, $params, $types = "")
{
    return prepared_query($mysqli, $sql, $params, $types)->get_result()->fetch_row();
}

そして今、それは次のように呼び出すことができます

$check = check_database($sql, [$id, $mail]);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=20064&siteId=1