Mysql SQL查询不知道变量
我试图使用一个简单的下拉列表来查询数据库中的一些表,其中列出了表的名称。查询只有一个记录结果,显示数据库中注册的最年轻机构的名称和年龄Mysql SQL查询不知道变量,mysql,Mysql,我试图使用一个简单的下拉列表来查询数据库中的一些表,其中列出了表的名称。查询只有一个记录结果,显示数据库中注册的最年轻机构的名称和年龄 $table = $_GET['table']; $query = "select max('$table'.est_year) as 'establish_year' from '$table' "; 我需要将表的名称作为变量发送到querier php文件。在查询语句中放入变量名时,无论方法是GET还是POST,都会出现错误: “您的SQL
$table = $_GET['table'];
$query = "select max('$table'.est_year) as 'establish_year' from '$table' ";
我需要将表的名称作为变量发送到querier php文件。在查询语句中放入变量名时,无论方法是GET还是POST,都会出现错误:
“您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以了解使用‘客户’中的‘上一个’near'.order)作为‘上一个’的正确语法。”
将表名用单引号括起来,这是无效的SQL(这是字符串的语法,而不是表名)。你要么根本不应该把名字包起来,要么用反勾号把它包起来(在美式键盘布局中,这是标签上方的键) 您也不应引用别名
成立年份
:
select max(`$table`.est_year) as establish_year from `$table`
此外,您的代码易受SQL注入攻击强>
更新(sql注入防御):
在这种情况下,最合适的操作可能是对照白名单验证表名:
if (!in_array($table, array('allowed_table_1', '...'))) {
die("Invalid table name");
}
单引号('),在mysql中,它表示字符串值
SELECT *, 'table' FROM `table`;
因此,您的查询应该是
$table = $_GET['table'];
$query = "select max($table.est_year) as 'establish_year' from $table ";
也读了老帖子
您的代码也容易受到SQL注入的攻击。你可以用这样的东西
//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
$firstName = clean($_POST['firstName']);
$lastName = clean($_POST['lastName']);
.
.
.
您确定错误消息正好指向该行吗?这与查询中的错误消息完全不同。您提供了不相关的代码。您确定GET没有任何额外的尾随空格吗?当我手动键入表名时,一切正常。我确信get value后面没有空格,我需要使用mysql\u escape\u string()还是什么?@rezasaberi:No有两个原因:1)
mysql\u escape\u string
永远不应该使用(mysql\u real\u escape\u string
已经取代了它)和2)它是一个表名,规则不同。请参阅更新后的答案。@Jon:操作代码如何容易受到SQL注入的攻击?我的不是在阻止,而你的是在阻止?@FahimParkar:请看你自己回答下面的评论。使用白名单会阻止注入,因为只接受少数已知的安全输入。-1:此代码不会阻止SQL注入,因为$table
将是一个表名,而不仅仅是任何字符串。引用规则是不同的。@Jon:你看到返回mysql\u real\u escape\u字符串($str)了吗代码>?我知道。您必须意识到,如果返回的值没有括在引号中,那么mres
将一无所获,在本例中,它不能括在引号中,因为它不是字符串。