为sql查询插入变量的正确方法是什么

时间:2013-01-09 20:42:21

标签: php mysql sql

我这里有一段php用于在用户提供的两个日期之间拉出某些日期

if($start_date!="" && $end_date!=""){
$query[]="submit_time BETWEEN '$start_date' and '$end_date'";
}

为什么在处理完字符串之后才有效。但是widley除了这样做的方式似乎是:

if($start_date!="" && $end_date!=""){
$query[]="submit_time BETWEEN '".$start_date."' and '".$end_date."'";
}

任何人都可以详细说明为什么两种方式都有效,哪种方式最好?我被告知今天我应该第一种方式,但我总是从字符串中分离出变量。任何想法?

或者更好的例子:

$sql="SELECT * FROM $tbl_name WHERE submit_time BETWEEN 
'$start_date' and '$end_date'";

V.S。

$sql="SELECT * FROM $tbl_name WHERE submit_time BETWEEN 
'".$start_date."' and '".$end_date."'";

4 个答案:

答案 0 :(得分:4)

更明智是核心方式。如果这是您唯一的检查,那么您将进行SQL注入。

你应该使用准备好的陈述:

http://php.net/manual/en/pdo.prepare.php

如果你只是在谈论字符串插值,我更喜欢sprintf,因为我认为它更具可读性并且可以进行类型转换:

$name = 'John Doe';
sprintf("Hello %s - How are you today", $name);

请不要在你的sql中使用用户提供的开始和结束日期。

答案 1 :(得分:3)

实际上......这些版本都不是最好的解决方案。如果您使用预准备语句并将开始日期和结束日期作为此查询的参数提供,那将会更好。如果你使用PDO,它看起来像这样:

$stmt = $db->prepare('SELECT * FROM somewhere WHERE submit_time BETWEEN :startdate AND :enddate');
$stmt->bindParam(':startdate', $start_date);
$stmt->bindParam(':enddate', $end_date);
$stmt->execute();

通过这种方式,您可以确定不会弄乱您的查询,并且它也会更快地执行,因为查询解析器不必评估您的变量是否包含任何SQL语法。

回答你的其余问题:这是编写干净代码的问题。在字符串中嵌入变量看起来有点乱,因为您可以在任何提供语法高亮的编辑器中轻松告诉。如果要将数组元素添加到字符串中,则会变得特别麻烦。

答案 2 :(得分:0)

我一直使用第一种方法,我认为这只是作为一个选择问题,而不是与你的编码有关。但是,这只是我的意见..让我们等着看其他人

答案 3 :(得分:0)

他们之间几乎没有区别,这只是个人的偏好。你真的应该使用预准备语句(PDO),但至少将你的变量包装在mysql_real_escape_string()中以使其更安全。 PDO是可行的方式。

$start_date = mysql_real_escape_string($start_date);
$end_date = mysql_real_escape_string($end_date);

$sql="SELECT * FROM $tbl_name WHERE submit_time BETWEEN 
'$start_date' and '$end_date'";