0

我这里有一段 php,我用来在用户提供的两个日期之间提取某些日期

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

为什么在处理字符串之后,它起作用了。然而,威德利例外的做法似乎是:

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'";

VS

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

4 回答 4

4

Neighter 是最正确的方法。如果这是您进行的唯一检查,那么您将进行 sql 注入。

您应该使用准备好的语句:

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

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

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

请在任何情况下都不要在您的 sql 中使用用户提供的开始和结束日期。

于 2013-01-09T20:45:15.070 回答
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 语法。

回答您的其余问题:这是编写干净代码的问题。在字符串中嵌入变量看起来有点混乱,因为您可以在任何提供语法突出显示的编辑器中轻松分辨。如果你有数组元素要添加到你的字符串中,它会变得特别混乱。

于 2013-01-09T20:48:23.777 回答
0

我一直使用第一种方法,我认为这只是一个选择问题,而不是与你的编码有任何关系。但是,这只是我的意见.. 让我们拭目以待

于 2013-01-09T20:44:56.543 回答
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'";
于 2013-01-09T20:48:52.167 回答