我正在尝试使用一个简单的下拉列表查询数据库中的某些表,其中列出了表的名称。查询只有一个记录结果,显示数据库中注册的最年轻的学院的名称和年龄!
$table = $_GET['table'];
$query = "select max('$table'.est_year) as 'establish_year' from '$table' ";
我需要将表的名称作为变量发送到查询器php文件。当我将变量名称放在查询语句中时,无论方法是GET还是POST两种方式,它都会给出错误:
“您的SQL语法中有错误;请查看与您的MySQL服务器版本对应的手册,以便在'。''附近使用正确的语法,作为'customers''中的'last'”
答案 0 :(得分:2)
您将表名包装在单引号中,这是无效的SQL(这是字符串的语法,而不是表名)。您应该根本不包装名称,或者将其包装在反引号中(在美国键盘布局上,这是 TAB 上方的键)。
您也不应引用别名established_year
:
select max(`$table`.est_year) as establish_year from `$table`
此外,您的代码容易受到SQL注入攻击。 Fix this immediately! 强>
在这种情况下,最合适的操作可能是针对白名单验证表名:
if (!in_array($table, array('allowed_table_1', '...'))) {
die("Invalid table name");
}
答案 1 :(得分:-1)
单引号('),在mysql中,它表示字符串值。
SELECT *, 'table' FROM `table`;
所以你的查询应该是
$table = $_GET['table'];
$query = "select max($table.est_year) as 'establish_year' from $table ";
另请阅读旧帖phpmyadmin sql apostrophe not working。
此外,您的代码易受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']);
.
.
.