我正在尝试根据传递给脚本的选择来构建动态查询。例如:
$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。
e.g。当可变数据$ cur_maand_jaar包含'2015-01'时,选择将低于2014年
如何阻止这种情况发生并选择低于“2015-01”的所有内容?
答案 0 :(得分:0)
我建议引用该变量,因此值按字面意思取得:
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));
答案 1 :(得分:0)
在SQL文本中,将字符串文字用单引号括起来,因此它的不被评估为数字表达式。
在数字上下文中进行评估:2015-01
生成的值为2014
。
但 '2015-01'
会被评估为字符串文字。
(如果在数字上下文中评估字符串文字(例如'2015-01' + 0
),字符串将计算为2015
的数值。)
您发布的代码似乎容易受到 SQL注入。
的攻击考虑$cur_jaar_maand
评估为 0 OR 1=1 --
时生成的SQL文本。
更好的模式是使用预备语句和绑定占位符。