以下查询有什么问题

时间:2013-07-05 17:24:26

标签: php mysql

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

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

但我收到错误

  

注意:未定义的变量:/ path_to_file.php中的productname在线   431

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

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

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

4 个答案:

答案 0 :(得分: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'包装在单引号中。见上文。

答案 1 :(得分: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')";

答案 2 :(得分:1)

有几件事是错的:

首先,您没有转义输入数据,因此您很容易被SQL注入。

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

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

答案 3 :(得分: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最简单。