2011-09-14 106 views
1

我有一个查询:什么时候在mysql查询中评估变量?

$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当$查询设置计算的值,或当它是由mysql_query()叫什么名字?

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

+2

这不是一个MySQL查询,它是被传递到的mysql_query一个PHP字符串(你可能用sprintf这样)并被视为查询。该变量被插入到字符串BEFORE中,mysql_query被调用,此时该字符串被分配给'$ query'。 –

回答

3

该变量在设置$ query时被评估。

这正是像这样做:如果你想多次使用不同的参数执行相同的查询,使用prepared statements

$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

+0

使用以下内容会不会更正确? '$ query-> bind_param('s',$ startdate); $ startdate = $ date1; $ query-> execute(); ... $ startdate = $ date2; $ query-> execute(); ...' – MichaelRushton

1

因为它被封装在双引号中,所以在设置时会被评估$ $查询。

+0

有没有一种方法可以形成'$ query',以便它在发送到mysql_query之前不会被评估? – aslum

0

当你设置一个这样的查询时,除了字符串连接之外,你只能提到@ arnaud576875。如果您更改$ startdate变量,则需要重置查询。

你通过它之前MYSQL_QUERY

$query_format = "SELECT title FROM new_books WHERE timestamp >= '%s'"; 
$newbooks = mysql_query(sprintf($query_format, $startdate)) or die (mysql_error()); 

或者只是使用准备好的语句作为提示