基本 PHP - SQL 查询中的条件串联


Basic PHP - Conditional Concatenation Within SQL Query

我在我认为应该是一些相当简单的PHP时遇到了一些麻烦。它在WordPress内部运行,但问题不应该是WordPress特定的。$wpdb->get_results() 只是一种查询 WordPress 数据库的方法,而不必使用连接字符串。我还使用几个 $_GET 命令。

这是我到目前为止所拥有的:

$Data = $wpdb->get_results("SELECT *
    FROM database.table
    WHERE sem.MonthNum >= " .$_GET["minMonth"]. "
    AND sem.MonthNum <= " .$_GET["maxMonth"]. "
    AND sem.Year  >= " .$_GET["minYear"]. "
    AND sem.Year <= " .$_GET["maxYear"]. ");

只要填充了 _GET 美元,这就可以了。我想添加一个默认值,如果 $_GET 为空,则设置一个数字,如果它不为空,则获取该数字。类似的东西...

$Data = $wpdb->get_results("SELECT *
    FROM database.table
    WHERE sem.MonthNum >= " if(!$_GET){echo 1;} else {echo ".$_GET['"minMonth'"]. "} "

但这对我不起作用...可能是一些愚蠢的PHP语法错误,我不确定所有的echo语句和其他引号中的引号等等。

对于每个变量,请执行以下操作:

$minMonth = isset($_GET["minMonth"]) ? intval($_GET["minMonth"]) : 1;
... 
"WHERE sem.MonthNum >= " .minMonth. "

intavl() 调用会将 $_GET 值转换为整数(如果尚未转换为整数),这将保护您免受 SQL 注入安全问题的影响。如果您需要对字符串执行类似操作,请改用类似 mysql_escape_string() 的内容。

您可以为每个变量添加一个变量,例如:

// If not set $minMonth is set to 1
$minMonth = (isset($_GET['minMonth']) ? $_GET['minMonth'] : 1);

只需对其他变量也执行此操作。

您可以使用速记符号,例如 Scott 和 David 直接在查询中显示:

$Data = $wpdb->get_results("SELECT *
FROM database.table
WHERE sem.MonthNum >= ".(!isset($_GET['minMonth'])?'1':$_GET['minMonth'])."
AND...

不过,您确实需要先清理变量,否则您可能会很容易被注入 SQL。