パラメータを使用してプリペアドステートメントを実装するにはどうすればよいですか?このクエリでも可能ですか?

coopwatts

したがって、私はMySQLとPHPを初めて使用し、データベース構造が少し変わっているため、条件に基づいてクエリを作成しました。開発を進める前に、インジェクションを防ぐためにパラメーターを使用してプリペアドステートメントでクエリを実装したいと思いました。real_escape_stringを使用するとSQLインジェクションを防ぐことができると述べたビデオを見たので、最初の質問は、これで十分ですか?または絶対に必要なパラメータです。そうだと思います。それに続く質問は、それが非常に長いこと以外に、私がこれを実装した方法に何か問題がありますか?基本的に、フォームには4つのドロップダウンがあり、各ドロップダウンには5つのオプションが含まれています。ユーザーは、各ドロップダウンから1つのオプションを選択して、送信できます。$ _POST変数を使用して、データベースから考えられる最善の方法で必要なものを選択します。だから、もしあれば 私がこれをどのように行ったかに問題はありません。私の質問は、これを使用して準備されたステートメントをどこでどのように実装し始めるのかということです。私はそれを研究しましたが、私が何をしているのか理解するのは難しいです。パラメータを設定するために同じif-else条件が必要だと思っていましたが、それでも?を配置する場所がわかりません。誰かが私を助けてくれるなら、私は大いに感謝するでしょう。ありがとう....大きなクエリは以下のとおりです。

また、getHourValue()は、$ _ POST ['hours']の値に応じて、クエリシーケンスを含む追加の文字列を返します。これは、何度も使用される非常に長いセグメントであったため、関数に配置しました。

            if($_POST['category'] == "anywhere") {
                if($_POST['food'] == "No") {
                    if($_POST['extra'] == "anything") {
                        $sql = "SELECT name, description FROM pubs WHERE (food LIKE '%Yes%' " . getHourValue($_POST['hours']) . ") 
                        OR (food LIKE '%No%' " . getHourValue($_POST['hours']) . ")";
                    }
                    else if($_POST['extra'] == "everything") {
                        $sql = "SELECT name, description FROM pubs WHERE (food LIKE '%Yes%' AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%' "
                                . getHourValue($_POST['hours']) . ") OR (food LIKE '%No%'
                                AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%' "
                                . getHourValue($_POST['hours']) . ")";
                    }
                    else {
                        $sql = "SELECT name, description FROM pubs WHERE (food LIKE '%Yes%' AND " . $_POST['extra'] . " LIKE '%Yes%' " . getHourValue($_POST['hours']) .") 
                        OR (food LIKE '%No%' AND " . $_POST['extra'] . " LIKE '%Yes%' " . getHourValue($_POST['hours']) . ")";
                    }
                }
                else if($_POST['extra'] == "anything") {
                    $sql = "SELECT name, description FROM pubs WHERE food LIKE '%Yes%' "
                            . getHourValue($_POST['hours']);
                }
                else if($_POST['extra'] == "everything") {
                    $sql = "SELECT name, description FROM pubs WHERE food LIKE '%Yes%'
                            AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%' " 
                            . getHourValue($_POST['hours']);
                }
                else { 
                    $sql = "SELECT name, description FROM pubs WHERE food LIKE '%Yes%' 
                            AND " . $_POST['extra'] . " LIKE '%Yes%' "
                            . getHourValue($_POST['hours']);
                }
            }
            else {
                if($_POST['food'] == "No") {
                    if($_POST['extra'] == "anything") {
                        $sql = "SELECT name, description FROM pubs WHERE (category LIKE '%" . $_POST['category'] . "%' " . getHourValue($_POST['hours']) . "
                                AND food LIKE '%Yes%') OR (category LIKE '%" . $_POST['category'] . "%' " . getHourValue($_POST['hours']) . " AND food LIKE '%No%')";

                    }
                    else if($_POST['extra'] == "everything") {
                        $sql = "SELECT name, description FROM pubs WHERE (category LIKE '%" . $_POST['category'] . "%'"
                                . getHourValue($_POST['hours']) . " AND food LIKE '%Yes%' AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%') 
                                OR (category LIKE '%" . $_POST['category'] . "%'"  
                                . getHourValue($_POST['hours']) . " AND food LIKE '%No%' AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%')";
                    }
                    else {
                        $sql = "SELECT name, description FROM pubs WHERE (category LIKE '%" . $_POST['category'] . "%' "
                            . getHourValue($_POST['hours']) . " AND food LIKE '%Yes%' AND " . $_POST['extra'] . " LIKE '%Yes%') OR (category LIKE '%" . $_POST['category'] . "%' " . getHourValue($_POST['hours']) . " 
                            AND food LIKE '%No%' AND " . $_POST['extra'] . " LIKE '%Yes%')";
                    }
                }
                else if($_POST['extra'] == "anything") {
                    $sql = "SELECT name, description FROM pubs WHERE category LIKE '%" . $_POST['category'] . "%'
                            AND food LIKE '%Yes%' "
                            . getHourValue($_POST['hours']);
                }
                else if($_POST['extra'] == "everything") {
                    $sql = "SELECT name, description FROM pubs WHERE category LIKE '%" . $_POST['category'] . "%'
                            AND food LIKE '%Yes%' AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%' "
                            . getHourValue($_POST['hours']);
                }
                else {
                    $sql = "SELECT name, description FROM pubs WHERE category LIKE '%" . $_POST['category'] . "%'
                            AND food LIKE '%Yes%' AND " . $_POST['extra'] . " LIKE '%Yes%' "
                            . getHourValue($_POST['hours']);
                }
            }
ライセンダー

おそらく、ある種のクエリビルダーを作成する必要があります(またはフレームワークから既存のものを使用する必要があります)。上記のコードにプリペアドステートメントを追加すると、より複雑になります(ただし、それは言い訳にはなりません)。

例:配列内のすべての条件を収集し、それぞれにプレースホルダーを挿入してから、PDOステートメントで値をバインドします。

注:以下はテストされていません。

<?php

$sql = 'SELECT name, description FROM pubs';
$where = [];
$params = [];

// If condition
// then add it to where
// $where[] = '(field1 = :field1)';
// $params[':field1'] = $_POST['field1'];

// If another condition
// then add to where
// $where[] = 'field2 = :field2';
// $params[':field2'] = $_POST['field2'];

// Combine where conditions (you may need to implement both AND and OR)
if (!empty($where)) {
    $sql .= ' WHERE '.implode(' AND ', $where);
}

// Assuming this is your pdo object
$statement = $pdo->prepare($sql);

// Bind your parameter values
if (!empty($params)) {
    foreach ($params as $key => $value) {
        $statement->bindValue($key, $value, \PDO::_PARAM_STR);
    }
}

// Then fetch the records
$statement->execute();

$result = $statement->fetchAll(PDO::FETCH_ASSOC);

var_dump($result);

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ