我正在尝试根据传递给脚本的选择构建动态查询。例:
$qry = "SELECT * FROM machinekaart
INNER JOIN afleveradressen ON afleveradressen.raaid = mkrraaid
INNER JOIN kontaktpersonen ON kontaktpersonen.rkpraaid = mkrraaid
WHERE mkrrid != '' " ;
if($_SESSION['oud'])
$qry .= " AND mkrvo < " . $cur_jaar_maand;
字段 mkrvo 是一个文本字段,除了其他值外,还可以包含 yyyy-mm。
例如,当可变$cur_Maand_jaar包含"2015-01"时,选择将低于2014
我怎样才能阻止这种情况发生并选择低于"2015-01"的所有内容?
我建议引用该变量,因此值按字面意思获取:
if($_SESSION['oud'])
$qry .= " AND mkrvo < '" . $cur_jaar_maand . "'";
更好的是,请使用PDO,以便您可以使用绑定,它更安全,优化效果最好。
例如。
if($_SESSION['oud'])
$qry .= " AND mkrvo < ?";
// build your PDO Connection $myPdoConnection ...
$pdoStatement = $myPdoConnection->prepare($qry);
$pdoStatement->execute(array($cur_jaar_maand));
在 SQL 文本中,
将字符串文本括在单引号中,因此不会将其计算为数值表达式。
在数值上下文中求值:2015-01
生成值 2014
。
但'2015-01'
被评估为字符串文本。
如果在数字上下文中计算字符串文本(例如 '2015-01' + 0
) 字符串的计算结果将为数值 2015
.)
您发布的代码似乎容易受到 SQL 注入的攻击。
考虑当$cur_jaar_maand
碰巧计算为 0 OR 1=1 --
时生成什么 SQL 文本。
更好的模式是使用带有绑定占位符的预准备语句。