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
将一无所获,在本例中,它不能括在引号中,因为它不是字符串。