sql >> データベース >  >> RDS >> Mysql

mysqliを使用して、ユーザーが指定した値の数が可変である安全なSELECTクエリを作成するにはどうすればよいですか?

    実行するタスクは、プレースホルダーの数が可変のプリペアドステートメントです。これはPDOの方が簡単ですが、mysqliオブジェクト指向スタイルのアプローチを紹介します。いずれにせよ、受信スクリプトが予想されるデータ型の種類を認識できるように、常にjsonでエンコードされた配列を出力してください。

    一連の診断とエラーチェックを含むスニペットを配置しました。私はこのスクリプトをテストしていませんが、この投稿 と非常によく似ています。 。

    if (empty($_POST['companyname']) || empty($_POST['username'])) {  // perform any validations here before doing any other processing
        exit(json_encode([]));
    }
    
    $config = ['localhost', 'root', '', 'dbname'];  // your connection credentials or use an include file
    $values = array_merge([$_POST['companyname']], explode(',', $_POST['username']));  // create 1-dim array of dynamic length
    $count = sizeof($values);
    $placeholders = implode(',', array_fill(0, $count - 1, '?'));  // -1 because companyname placeholder is manually written into query
    $param_types = str_repeat('s', $count);
    if (!$conn = new mysqli(...$config)) {
        exit(json_encode("MySQL Connection Error: <b>Check config values</b>"));  // $conn->connect_error
    }
    if (!$stmt = $conn->prepare("SELECT user_scid, user_scid FROM linked_user WHERE company_name = ? AND username IN ({$placeholders})")) {
        exit(json_encode("MySQL Query Syntax Error: <b>Failed to prepare query</b>"));  // $conn->error
    }
    if (!$stmt->bind_param($param_types, ...$values)) {
        exit(json_encode("MySQL Query Syntax Error: <b>Failed to bind placeholders and data</b>"));  // $stmt->error;
    }
    if (!$stmt->execute()) {
        exit(json_encode("MySQL Query Syntax Error: <b>Execution of prepared statement failed.</b>"));  // $stmt->error;
    }
    if (!$result = $stmt->get_result()) {
        exit(json_encode("MySQL Query Syntax Error: <b>Get Result failed.</b>")); // $stmt->error;
    }
    exit(json_encode($result->fetch_all(MYSQLI_ASSOC)));
    

    これらの診断条件とコメントのすべてが肥大化することを望まない場合は、同じように機能するはずの最低限の骨と同等のものを次に示します。

    if (empty($_POST['companyname']) || empty($_POST['username'])) {
        exit(json_encode([]));
    }
    
    $values = explode(',', $_POST['username']);
    $values[] = $_POST['companyname'];
    $count = count($values);
    $placeholders = implode(',', array_fill(0, $count - 1, '?'));
    $param_types = str_repeat('s', $count);
    
    $conn = new mysqli('localhost', 'root', '', 'dbname');
    $stmt = $conn->prepare("SELECT user_scid, user_scid FROM linked_user WHERE username IN ({$placeholders}) AND company_name = ?");
    $stmt->bind_param($param_types, ...$values);
    $stmt->execute();
    $result = $stmt->get_result();
    exit(json_encode($result->fetch_all(MYSQLI_ASSOC)));
    


    1. LINQ to MySQL-最良のオプションは何ですか?

    2. oci_bind_by_nameおよびto_datePHP/ OCI / Oracle

    3. OracleSQLDeveloperでの新しいデータベースと新しい接続の作成

    4. SQLで同時イベントの数を計算する