PHP Mysql - 在Select语句中使用变量作为列名

时间:2014-09-05 15:50:16

标签: php mysql sql-server database

我的月份名称为列名,如jan,feb,march等。在我的表格中 在我的表单中,用户需要从下拉列表中选择一个月,我会选择用户 作为$ month_name。

我想看$ month_name中的数据不是0.00。

当我回复$ month_name时,我得到:jan或feb等。

我在select语句中使用了$ month_name但没有工作:

第一次尝试不起作用:

$sql = "SELECT * FROM bookoff_monthly WHERE '.$month_name.' <> 0.00 AND year='$year' ";

第二次尝试不起作用:

$sql = "SELECT * FROM bookoff_monthly WHERE $month_name <> 0.00 AND year='$year' ";

** 但以下情况有效,但这不是我想要的:

$sql = "SELECT * FROM bookoff_monthly WHERE jan <> 0.00 AND year='$year' ";

3 个答案:

答案 0 :(得分:1)

这是我认为适当转义的内容:

$sql = "SELECT * FROM bookoff_monthly WHERE `".$month_name."` <> 0.00 AND year='".$year."' ";

请注意,在$month_name左右,您在语句中有反引号,然后是双引号(整个查询被它们包围),然后是PHP连接(.)。您最好将其视为string + variable + string ...而不是字符串中的变量。与$ year变量相同。

在你的第一个声明中你很接近,但是你使用单引号来突破字符串,但是如果字符串包含在双引号中,你就不能这样做。

$var = "is a";

echo("This ".$var." string 'with quoted text'"); // This is a string 'with quoted text'

echo("This ".$var." string \"with quoted text\""); // This is a string "with quoted text"

echo('This '.$var.' string "with quoted text"'); // This is a string "with quoted text"

echo('This '.$var.' string \'with quoted text\''); // This is a string 'with quoted text'

假设您的变量格式正确,那么这应该可行。

编辑:正如VMai所说,因为你正在处理3个字母的月份名称,你将不可避免地在这个查询中使用“DEC”或“dec”,这是MySQL中的保留字,所以你必须< / strong>用反引号转义名称,否则查询会被误解。

答案 1 :(得分:1)

关于直接问题:

#1的问题在于您尝试混合单引号和双引号。假设$ month_name =“jan”,这将给你:

SELECT * FROM bookoff_monthly WHERE '.jan.' <> 0.00 AND year='$year'

作为'.jan。'不等于0.00,这将找不到任何记录。

你的第二个看起来像我应该工作。您可以尝试打印生成的字符串以查看它给您的内容。也许您在month_name或其他东西中有其他不期望的字符。

但无论如何,这只是要求SQL注入攻击。例如,黑客可以伪造你的输入表格并设置jan =“1 + 1 = 2;从bookoff_monthly删除1.00”,现在将删除给定年份的所有内容。

此外,任何能够动态生成字段名称的设计都应立即受到质疑。

这样做的正确方法是与每个月的一条记录建立多对多的关系。像create table bookoff_month(bookoff_id int,month char(3),amount decimal(7,2))。然后你的查询变为select * from bookoff_monthly join bookoff_month on bookoff_month.bookoff_id = bookoff_monthly.bookoff_id where month =?和年=?并用准备好的语句填充它们,或者至少将参数包装在一个正确转义的函数中。

答案 2 :(得分:-2)

$sql = 'SELECT * FROM bookoff_monthly WHERE '.$month_name.' <> 0.00 AND year="'.$year.'"