2014-01-18 126 views
1

我有以下幾點:陣列中選擇查詢

<?php 

    $array = join(',', $ids); // this prints 3,4,6,7,8 

    $stmt = $cxn->prepare('SELECT * FROM comments WHERE id IN (?)'); 
    $stmt->bind_param('i', $array); 
    $stmt->execute(); 

?> 

然而,當我把它打印結果,那隻能說明從第一個ID(3)的意見,而不是其他人。怎麼了?

+0

在'IN'條款每個元素都是一個獨立的元素,而不是 –

+0

你傳遞一個字符串到查詢,但告訴查詢期待一個整數(在'i'在'bind_param一個巨大的字符串()')。將'i'改爲's',它應該可以工作。 – jedwards

+0

@jedwards沒有工作。 – Bagwell

回答

-1

將它們綁定到一個字符串。

$idString = ''; 
foreach($ids as $id) { 
$idString .= $id . ','; 
} 
$idString = substr($idString, 0, -1); 
$stmt = $cxn->prepare('SELECT * FROM comments WHERE id IN (?)'); 
$stmt->bind_param('s', $idString); 
$stmt->execute(); 
+0

你真的嘗試過嗎? –

+0

是嗎?有用。爲什麼downvote? – Mave

+2

因爲它不應該工作....你正在創建包含「3,4,6,7,8」的字符串,並試圖將其綁定爲一個整數 –

1

我相信這工作打算,你必須直接替換值到字符串:

$idString = ''; 
foreach($ids as $id) { 
$idString .= $id . ','; 
} 
$idString = substr($idString, 0, -1); 
$stmt = $cxn->prepare("SELECT * FROM comments WHERE id IN (".$idstring.")"); 
$stmt->execute(); 

不幸的是,這可以再打開你到SQL注入攻擊。

+0

任何方式來做到這一點,同時避免漏洞? – Bagwell

+0

@Bagwell,當然,最簡單的方法是驗證/轉義'$ ids' - 一個更復雜的方法是在知道'$ ids'的長度後構建你傳遞的字符串,幷包含很多'?'符號,然後相應地構建'bind_param()'函數參數。 – jedwards

0
$arrayCount = count($ids); 
$binders = array_fill(0, $arrayCount, '?'); 

// Create an array of references to the values we want to bind 
$bindValues = array(); 
foreach($ids as $key => $id) 
    $bindValues[$keys] = &$ids[$key]; 

// Build SQL statement with the necessary number of bind placeholders 
$stmt = $cxn->prepare(
    'SELECT * FROM comments WHERE id IN (' . implode(',', $binders) . ')' 
); 
// Bind each value (has to be done by reference) 
call_user_func_array(array($stmt, "bind_param"), $bindValues)); 
$stmt->execute();