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

问题描述 投票:0回答:4

我的表格中有月份名称作为列名称,例如 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' ";
php mysql sql-server database
4个回答
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 中的保留字,因此您必须使用转义名称反引号,否则查询将被误解。


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; delete from bookoff_monthly where 1.00 ",现在它将删除给定年份的所有内容。

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

执行此操作的正确方法是与每个月的一条记录建立多对五的关系。就像创建表 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=?和年份=?并用准备好的语句填充它们,或者至少将参数包装在执行正确转义的函数中。


0
投票

$年份 = $_POST['年份']; $月 = $_POST['月']; $result = mysqli_query($conn, "SELECT * FROM 01_SalaryMaster whereactualmonth = '".$Month."' andactualyear = '".$Year."'") or die("数据库错误:".mysqli_error($conn ));


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.