SQL select中的变量

时间:2016-01-18 18:05:56

标签: php sql

我试图用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`;";

如何使变量不会混淆查询?

3 个答案:

答案 0 :(得分:3)

看看PDO prepared statements

它们允许您在查询中使用变量而不必过多担心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);