したがって、私は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]
コメントを追加