在MySQL中的select语句中阻止变量计算

时间:2015-02-04 15:35:37

标签: php mysql

我正在尝试根据传递给脚本的选择来构建动态查询。例如:

$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”的所有内容?

2 个答案:

答案 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文本。

更好的模式是使用预备语句绑定占位符