在 MySQL 中的选择语句期间防止变量中的计算


preventing calculations in variables during a select statement in 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。

例如,当可变$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 文本。

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