我试图用PHP制作一个搜索栏,用get脚本显示我们存储的产品。现在我想把我得到的变量放在我的SQL查询中:
$search = $_GET['q'];
$sql = "SELECT
`product`.`productcode`,
`product`.`productnaam`,
`product`.`prijs`,
`product`.`voorraad`,
`afbeelding`.`image_id`,
`afbeelding`.`image_ctgy`
FROM `product`, `afbeelding`
WHERE `product`.`productcode` = `afbeelding`.`image_id` AND `afbeelding`.`image_ctgy` = $search
GROUP BY `productnaam`
ORDER BY `productnaam`;";
如何使变量不会混淆查询?
答案 0 :(得分:3)
它们允许您在查询中使用变量而不必过多担心MySQL注入。
$stmt = $dbh->prepare("SELECT
`product`.`productcode`,
`product`.`productnaam`,
`product`.`prijs`,
`product`.`voorraad`,
`afbeelding`.`image_id`,
`afbeelding`.`image_ctgy`
FROM `product`, `afbeelding`
WHERE `product`.`productcode` = `afbeelding`.`image_id` AND `afbeelding`.`image_ctgy` = :search
GROUP BY `productnaam`
ORDER BY `productnaam`");
$stmt->bindParam(':search', $search);
答案 1 :(得分:1)
$search = mysqli_real_escape_string($_GET['q']);
$sql = "SELECT product.productcode, product.productnaam, product.prijs, product.voorraad, afbeelding.image_id, afbeelding.image_ctgy FROM product, afbeelding WHERE product.productcode = afbeelding.image_id AND afbeelding.image_ctgy = '" . $search . "' GROUP BY productnaam ORDER BY productnaam";
或者使用PDO代替(OOP):
$dbh = new mysqli($servername, $username, $password, $dbname);
$stmt = $dbh->prepare("SELECT product.productcode, product.productnaam, product.prijs, product.voorraad, afbeelding.image_id, afbeelding.image_ctgy FROM product, afbeelding WHERE product.productcode = afbeelding.image_id AND afbeelding.image_ctgy = :search GROUP BY productnaam ORDER BY productnaam");
if ($stmt->execute([':search' => $_GET['q']])) {
while ($row = $stmt->fetch()) {
print_r($row);
}
}
如果您使用旧版本的php,请将[':search' => $_GET['q']]
替换为array(':search' => $_GET['q'])
答案 2 :(得分:0)
使用filter_input()。它将确保send $ _GET变量是一个安全字符串。
在你的例子中:
// q is the name of the $_GET variable.
$search = filter_input(INPUT_GET, 'q', FILTER_SANITIZE_SPECIAL_CHARS);