2011-09-14 72 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()); 

或者只是使用準備好的語句作爲提示