$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查询有问题。但是有什么不对?
答案 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最简单。