2012-01-18 115 views
-2

目前我的查詢看起來像取多個領域一次

$stmt = $this->db->prepare('SELECT `body` FROM `messages` WHERE `id`=? AND `status'='success'); 
    $stmt->bind_param("i", $msgid); 
    $rc = $stmt->execute(); 
    $stmt->bind_result($message); 
    $stmt->fetch(); 
    $stmt->close(); 

比方說,$msgid是陣列(1,2,5,7)。是否有可能獲取所有bodystatus字段其中id是1,2,5,7一次和合並所有body年代到由空格分隔一個變量?如果是,我該怎麼辦?

+0

你的意思是像'... WHERE id IN(1,2,5,7)''? – Quasdunk 2012-01-18 13:46:00

+0

@Quasdunk是的。假設'id 1'的'body'是'sample1'。 'id 2'是'sample2' ..等等。我想在一個變量中獲得'sample1 sample2' – heron 2012-01-18 13:46:56

+0

我有一個問題。雖然可以將所有的身體合併到一個字符串,那麼狀態呢?它必須是什麼形式? – 2012-01-18 14:00:42

回答

1

GROUP_CONCAT - 下面的代碼應該做你需要的與PDO。

$values = array(1, 2, 5, 7); 
$parameters = implode(',', str_split(str_repeat('?', count($values))); 

$stmt = $this->db->prepare(" 
    SELECT 
     GROUP_CONCAT(body SEPARATOR ' ') as gbody 
    FROM 
     messages 
    WHERE 
     id IN($parameters) 
     AND status='success' 
"); 
$stmt->execute($values); 
$res = $stmt->fetch(); 
echo $res['gbody']; 
$stmt->close(); 
+1

@ $ ValueCount = implode(',',array_fill(0,count($ values),'?'));';-) – 2012-01-19 11:01:28

+0

@ Col.Shrapnel:爲什麼array_fill會有幫助? :) – rasmusx 2012-01-19 11:28:49

+1

它會爲你節省4行。四是因爲在你當前的代碼中你必須在循環之前添加'$ valueCount ='';'。所以,使用array_fill它將是一行而不是5。 – 2012-01-19 11:41:44

1

不知道這是可能的參數,但它很容易與內置SQL:

$imp=implode(',',$msgid); 
"SELECT `body`, `status` FROM `messages` WHERE `id` IN (0$imp)" 

的0後,開括號幫助您在的$ MSGID的障礙是一個空數組。

這是假設is_numeric($ MSGID [$ i])是所有有效$我真的,或者你失去了你的數據庫...

+0

你能編輯我提供的代碼嗎? – heron 2012-01-18 13:49:53

+1

其實閱讀我的答案的第一行會告訴你,我的解決方案不能使用參數。所以編輯你的代碼不是一種選擇。因爲懶得閱讀而下調是不禮貌的。 – 2012-01-18 13:52:27

2

沒有,有地在語句沒有佔位符。 您必須編寫一個簡單的程序,它必須生成(?,?,?)字符串才能添加到查詢中,然後將您的數組綁定到此查詢。

好,它竟然是在一次問題:

  1. 如何查詢多個條件
  2. 如何使用預處理語句
  3. 如何建立這樣一個查詢數據庫取多行
  4. 如何在一箇中取多個字段

但是似乎你不必短期答案,但書(或者更確切地說,二 - 基本的PHP和MySQL的基礎之一),這裏有供您參考

  1. 使用報表的答案。 SQL語句WHERE id IN(1, 2, 5, 7)將查詢數據庫中的所有id。
  2. 正如我上面寫的,創建一個小程序,以產生(?,?,?)聲明,用數組元素的?匹配數號碼。比平常的方式。
  3. 我相信,execute()的手冊頁確實包含了一個獲取多行的例子。我總是參考自己的例子手冊。
  4. SQL函數group_concat()可以做到這一點。 select group_concat(body SEPARATOR ' ')將選擇你所有的身體在一排
+0

是否可以將所有表作爲數組提取,然後逐個獲取確切的行? – heron 2012-01-18 13:51:14

+0

這個問題是無關緊要的。您的數據庫API可以讓您確實獲取多行。你確定你不知道該怎麼做? – 2012-01-18 13:54:57