2011-12-23 55 views
1

mysql_real_escape_string將斜線添加到IN子句中的值,因此不會返回任何值。我如何發送在IN子句中使用mysql_real_escape_string()轉義的數組值?在IN子句中使用mysql_real_escape_string

這裏是我的代碼:mysql_real_escape_string這樣的變化之後

$names_array = array('dave','smith'); 
$names = mysql_real_escape_string("'". implode("', '", $names_array) ."'"); 
$sql = "SELECT * FROM user WHERE user_name IN ($names)"; 
$results = mysql_query($sql); 

查詢:

SELECT * FROM user WHERE user_name IN (\'dave\', \'smith\') 

我這裏不希望在IN子句這些斜線。此外,我不希望IN子句中直接替換值。 在此先感謝。

回答

4

這可能會這樣做。

$names = "'". implode("', '", array_map('mysql_real_escape_string', $names_array)). "'"; 
+0

太棒了。謝謝 –

0

請勿使用mysql_real_escape_string;請不要直接使用mysql_*函數;使用ADODB或somesuch;請勿以這種方式連接查詢,請使用佔位符(?)和準備好的語句。你的代碼應該看起來類似於:

include('/path/to/adodb.inc.php'); 
$DB = NewADOConnection('mysql'); 
$DB->Connect($server, $user, $pwd, $db); 

# M'soft style data retrieval with binds 
$rs = $DB->Execute("select * from user where user_names in ?",array(array('dave','smith'))); 
while (!$rs->EOF) { 
    print_r($rs->fields); 
    $rs->MoveNext(); 
} 
+0

我覺得* mysqli *比adodb好? –

+0

謝謝湯姆Regner。 –

+1

@Shiplu只要它使用適當的過程,我不知道哪些數據庫訪問庫使用:);使用ADODB,PDO等的動機是,如果您的項目在開發期間切換數據庫,而不是php部分,則必須稍微調整SQL。 –