在mysql查询中什么时候对变量求值?


When are variables evaluated in a mysql query?

我有一个查询:

$startdate= date('Y-m-d H:i:s',strtotime("-1 week"));
$query = "SELECT title FROM new_books ".
         "WHERE timestamp >= '$startdate' ";
$newbooks = mysql_query($query) or die (mysql_error());

$startdate的值是在$query设置时求值,还是在mysql_query()调用时求值?

例如,说上面的查询返回0结果(mysql_num_rows($newbook)==0)我可以改变$startdate,然后再次调用$newbooks = mysql_query...,或者我需要再次设置$query首先?

变量在$query设置时求值。

就像这样做:

$query = "SELECT title FROM new_books ".
         "WHERE timestamp >= '" . $startdate . "' ";

如果您希望使用不同的参数多次执行相同的查询,请使用准备好的语句:

$query = $mysqli->prepare("SELECT title FROM new_books WHERE timestamp >= :startdate");
$query->bind_params("s", $startdate);
$query->execute();
...
$query->bind_params("s", $an_other_startdate);
$query->execute();
...

参见http://docs.php.net/manual/en/mysqli.prepare.php

的示例

由于它被封装在双引号中,因此在设置$query时将对其求值。

当您设置这样的查询时,除了@arnaud576875提到的字符串连接之外,您什么也不做。如果您更改了$startdate变量,则需要重置查询。

在传递给mysql_query

之前,可以这样使用sprintf
$query_format = "SELECT title FROM new_books WHERE timestamp >= '%s'";
$newbooks = mysql_query(sprintf($query_format, $startdate)) or die (mysql_error());

或者按照建议使用预处理语句