我的月份名称为列名,如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' ";
答案 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.'"