这是我的第一个程序,我已经做了大量的研究,试图回答这个问题,我无法解决问题:
<?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”附近使用正确的语法
P.S。我知道有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更新表,并且不显示错误消息。 Re SQL注入漏洞,请参阅我原来的PS声明
答案 0 :(得分:1)
在这一行:
$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 = ("SELECT " . $activity . "_" . $role . " FROM " . $activity . " WHERE activity_level='" . $activity_level . "'");
要记住的一件事是,当您执行SQL语句连接(“SELECT”。$ activity。“)时,就像在我的示例中一样,您可以打开SQL Injection次攻击。
答案 1 :(得分:0)
$ 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));
答案 2 :(得分:0)
乍一看,我认为“也许”activity_level数据类型不是字符串,而是数字。所以你不需要在WHERE activity_level ='$ activity_level'
中放置'...'编辑:为确保导致问题的原因,我建议记录,例如here。只需包含该类并将您的查询记录在一个文件中(非常简单),然后检查查询本身。
答案 3 :(得分:-1)
将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)."'"