3
$name=$_GET['name'];
$sql="SELECT `productname`, `price` FROM `stock` WHERE productname=".$name."
 and ( userid=".$_SESSION['user_id']." or userid='100')";

基本上我从一页获取产品名称。我正在传递查询,其中产品名称是 $name,用户 ID 是当前签名的用户 ID 或管理员用户 ID (100)。

但我收到错误

注意:未定义变量:第 431 行 /path_to_file.php 中的产品名称

line 431: <?php echo $productname;?>

其中 $productname=$row['productname'];

我感觉 sql 查询有问题。但是有什么问题呢?

4

4 回答 4

3
$name = $_GET['name'];
$sql = sprint("SELECT `productname`, `price` FROM `stock` WHERE productname='%s'
    and ( userid=%d or userid=100);",
    mysql_escape_string($name), intval($_SESSION['user_id']));

您需要productname='%s'用单引号括起来。看上面。

于 2013-07-05T17:28:30.177 回答
2

你需要单引号$name

$name=$_GET['name'];
$sql="SELECT `productname`, `price` FROM `stock` WHERE productname='". mysql_escape_string($name). "' and ( userid=".$_SESSION['user_id']." or userid='100')";
于 2013-07-05T17:27:25.227 回答
1

这是使用 PDO 以更安全的方式编写此代码的示例:

$name=$_GET['name'];
$sql="SELECT `productname`, `price` FROM `stock` 
  WHERE productname = ? AND userid IN (100, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($name, $_SESSION["user_id"]));

使用参数而不是将 PHP 变量插入字符串中,不仅对 SQL 注入防御更安全,而且更容易编写代码,也更容易阅读代码。

你也可以用 mysqli 做类似的事情,但我发现 PDO 是最简单的。

于 2013-07-05T18:01:56.593 回答
1

有几件事是错误的:

首先,您没有转义您的输入数据,因此您很容易受到 SQL 注入的攻击。

其次,如果$name确实是一个字符串值,则需要在查询中用单引号将其括起来。

除此之外,您的查询没有任何问题,只要它与您的表架构匹配并且您正在查找的数据存在于数据库中。

于 2013-07-05T17:29:10.830 回答