[英]SQL syntax: passing variable to SQL query
这是我的第一个程序,我做了大量研究试图回答这个问题,但我无法解决这个问题:
<?php
include "connect.php";
if (!$connection)
{
die('Could not connect: ' . mysql_error());
}
$submit = $_POST["submit"];
if ($submit=="Submit") {
$date = $_POST["date"];
$name = $_POST["name"];
$activity = $_POST["activity"];
$activity_level = $_POST["activity_level"];
$find_role = ("SELECT sales_role
FROM role
LEFT JOIN USER on user.role_id = role.id
WHERE user.user = '$name'");
$find_activity_points = ("SELECT $activity_$role
FROM $activity
WHERE activity_level = '$activity_level'");
$role = mysql_query($find_role);
$activity_points = mysql_query($find_activity_points);
if ($activity_points !== false) {
}
else {
echo mysql_error ();
die;
}
$convert_activity_points = array();
while ($row = mysql_fetch_array($activity_points, MYSQL_ASSOC)) {
$convert_activity_points[] = $row;
}
$set_points = "UPDATE $name SET $activity='$convert_activity_points' WHERE day='$date'";
mysql_query($set_points);
}
mysql_close($connection);
?>
这是我将 form.php 提交到 update.php 时收到的错误消息:您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的“FROM dial WHERE activity_level='70'”附近使用的正确语法
PS 我知道有 SQL 注入漏洞,但我是唯一一个使用这个程序的人,我在我的计算机上本地使用它。 我现在可以接受这些漏洞。
编辑:更改代码(我非常感谢反馈)
$find_role = "SELECT sales_role FROM role LEFT JOIN USER on user.role_id=role.id WHERE user.user='$name'";
$find_activity_points = "SELECT %s_%s FROM $activity WHERE activity_level='%d'";
list($role) = mysql_fetch_array(mysql_query($find_role));
$activity_points = mysql_query(
sprintf($find_activity_points, //the main string
$activity, $role, $activity, $activity_level) //the "arguments"
);
if ($activity_points !== false) {
}
else {
echo mysql_error ();
die;
}
用 0 更新表并且不显示错误消息。 重新SQL注入漏洞,看我原来的PS语句
$role 直到您的程序稍后才定义,即使这样它也是一个非标量值,它也会破坏您的查询。 您试图在变量具有值之前使用它们。 它们不会那样工作,一旦设置了该字符串,它将包含声明时这些变量的值。
您可能想使用 sprintf。 http://php.net/manual/en/function.sprintf.php
$find_activity_points = "SELECT %s_%s FROM %s WHERE activity_level='%d'";
进而
$activity_points = mysql_query(
sprintf($find_activity_points, //the main string
$activity, $role, $activity, $activity_level) //the "arguments"
);
当然,您仍然需要让$role
成为可以在字符串中正确处理的(标量)值。 一种(有点不安全,但很快)的方法是:
list($role) = mysql_fetch_array(mysql_query($find_role));
在这一行:
$find_activity_points = ("SELECT $activity_$role FROM $activity WHERE activity_level='$activity_level'");
我无法在代码中的任何地方看到您在执行查询之前定义了$role
的值。
因此,假设$activity == 'Eating'
您的SELECT
语句可能如下所示:
SELECT Eating_$role FROM Eating WHERE activity_level='...'
这可能会导致您的错误,因为我相信 MySQL 不允许在表/列名称中使用$
字符。
正如Babiker所建议的,您连接或使用 sprintf() 可以帮助解决其中的一些问题。
编辑:在评论中回答您的问题。
正如其他人所提到的,将您的$find_activity_points
行更改$find_activity_points
类似于以下内容:
$find_activity_points = ("SELECT " . $activity . "_" . $role . " FROM " . $activity . " WHERE activity_level='" . $activity_level . "'");
要记住的一件事是,当您像在我的示例中一样执行 SQL 语句连接 ("SELECT" . $activity . ") 时,您会打开自己的SQL 注入攻击。
乍一看,我认为“可能”activity_level 数据类型不是字符串,而是数字。 所以你不需要在 WHERE activity_level = '$activity_level' 中放置 '...'
编辑:为了确定导致问题的原因,我建议记录,就像这里的例子一样。 只需包含该类并将您的查询记录在一个文件中(非常简单),然后检查查询本身。
将 php 字符串连接到 mysql 字符串,例如:
mysql_query("SELECT * FROM `someTable` WHERE `someValue`='".$someVar'");
$_POST["activity_level"]
是一个带有'
的字符串。解决方案:
"SELECT `".$activity_$role."` FROM `".$activity."` WHERE `activity_level`='".mysql_real_escape_string($activity_level)."'"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.