2014-04-01 52 views
0

我想從數據庫中創建一個隨機「水果」的PHP數組。PDO - 使用綁定參數執行查詢不會產生任何結果?

數據庫類,我使用:

class Db 
{ 

private static $_instance = null; 
private $_pdo; 

private function __construct() 
{ 
    try { 

     $this->_pdo = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME .'', DB_USER, DB_PASS); 
    } catch (PDOException $e) { 
     die($e->getMessage()); 
    } 
} 

public static function getInstance() 
{ 
    if (!isset(self::$_instance)) { 
     self::$_instance = new Db(); 
    } 

    return self::$_instance; 
} 

public function prepare($sql) 
{ 
    return $this->_pdo->prepare($sql); 
} 

} 

正在使用數據庫來獲取「水果」通過使用3次獨立的查詢來計算以創建隨機條目的給定尺寸的陣列中的類和從數據庫中檢索「x」個隨機項目。

class FruitBasket 
{ 

private $_fruitArray = array(), 
     $_inputCode, 
     $_db; 

public function __construct($input = null) 
{ 
    $this->_inputCode = $input; 
    $this->_db = Db::getInstance(); 
    var_dump($this->_db); 
} 

public function pickFruit($count) 
{ 
    $doubleCount = $count * 2;//double the count used in calculation with the random number 
    $fruitIDs = ''; //the choosen fruits (id's) 
    $i = 0; 

    //#1 get total count of fruits table 
    $sql = "SELECT COUNT(*) FROM `fruits`"; 

    if ($query = $this->_db->prepare($sql)) { 

     if ($query->execute()) { 

      $allFruits = $query->fetch(PDO::FETCH_NUM); 

     } else { 

      print_r("ERROR QUERY DID NOT EXECUTE #1"); 
     } 

    } else { 

     print_r("ERROR CHECK SQL SYNTAX #1"); 
    } 

    //#2 calculate random number to pull from all of id's 
    $sql = "SELECT id FROM `fruits` WHERE RAND()* ? < ? ORDER BY RAND() LIMIT 0, ? "; 

    if ($query = $this->_db->prepare($sql)) { 

     $query->bindParam(1, $allFruits[0], PDO::PARAM_INT); 
     $query->bindParam(2, $doubleCount, PDO::PARAM_INT); 
     $query->bindParam(3, $count, PDO::PARAM_INT); 

     if ($query->execute()) { 

      while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 

       if ($i == 0) { 

        $fruitIDs .= "'" . $row['id'] . "'"; 

       } else { 

        $fruitIDs .= ", '" . $row['id'] . "'"; 
       } 

       $i++; 
      } 

     } else { 

      print_r("ERROR QUERY DID NOT EXECUTE #2"); 
     } 

    } else { 

     print_r("ERROR CHECK SQL SYNTAX #2"); 
    } 

    //#3 get the fruits 
    $sql="SELECT NAME FROM `fruits` WHERE `id` IN(?)"; 

    if ($query = $this->_db->prepare($sql)) { 

     $query->bindParam(1, $fruitIDs, PDO::PARAM_STR); 

     if ($query->execute()) { 

      while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 

       $this->_fruitArray[] = $row['name']; 
      } 

     } else { 

      print_r("ERROR QUERY DID NOT EXECUTE #3"); 
     } 

    } else { 

     print_r("ERROR CHECK SQL SYNTAX #3"); 
    } 

    return $this->_fruitArray; 
} 
} 

,我試圖表有一堆在它「成果」,的表是如何構成的一個例子:

================================== 
| ID | NAME      | 
================================== 
| 01 | Apple      | 
================================== 

我試圖通過使用來測試出這一切以下:

echo "<pre>"; 

echo "TESTING FRUIT ARRAY:</br></br>"; 

$basket = new FruitBasket(); 

echo"</br></br> PRINT_R: </br></br>"; 

print_r($basket->pickFruit(10)); 

echo "</br></br> VARDUMP: </br></br>"; 

var_dump($basket->pickFruit(10)); 

SQL查詢準備和執行正常,我可以做一個準備和綁定vardump,他們返回TRUE。但是,最後一個查詢沒有返回。

在執行的第一個查詢中執行$ allFruits的打印語句顯示錶中的正確總計數。

第二個查詢似乎正常工作,字符串$ fruitIDs,從表中獲取隨機ID,我可以回顯出來並確認確實返回了正確數量的ID。

出現的問題(我認爲)與第三查詢:

沒有返回表格此查詢。準備語句和執行一樣在var dump上返回true,但是沒有結果!

如果手動獲取從查詢#2輸出的ID並在mysql中自己運行它,則會返回正確的「水果」名稱。

我是否正確綁定變量?我閱讀the PHP manual的網頁,但很明顯我做錯了什麼。

請幫忙! :)

+2

http://stackoverflow.com/questions/15990857/reference-frequently-asked-questions-about-pdo#15991146 –

+0

你可能想要刪除很多你的代碼,你肯定不會導致問題(如大部分水果清單)。你有很多東西要閱讀。 。 。 – rhill45

+0

大點buzrw,我省略了之前發佈的一些內容,只是不想成爲發佈信息不足的問題之一。 – Shanedroid

回答

0

多虧了您的常識提供的鏈接,並輸入,使用以下:

Reference - frequently asked questions about PDO

Can I bind an array to an IN() condition?

我能夠通過改變來解決這個我查詢如下:

//#2 calculate random number to pull from all of id's 
     $sql = "SELECT id FROM `fruits` WHERE RAND()* ? < ? ORDER BY RAND() LIMIT 0, ? "; 

     if ($query = $this->_db->prepare($sql)) { 

      $query->bindParam(1, $allFruits[0], PDO::PARAM_INT); 
      $query->bindParam(2, $doubleCount, PDO::PARAM_INT); 
      $query->bindParam(3, $count, PDO::PARAM_INT); 

      if ($query->execute()) { 

       while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 

         $fruitIDs[] = $row['id']; 
       } 

      } else { 

       print_r("ERROR QUERY DID NOT EXECUTE #2");    } 

     } else { 

      print_r("ERROR CHECK SQL SYNTAX #2"); 
     } 

     //#3 get the fruits 
     $inQuery = implode(',', array_fill(0, count($fruitIDs), '?')); 

     $sql="SELECT NAME FROM `fruits` WHERE `id` IN($inQuery)"; 

     if ($query = $this->_db->prepare($sql)) { 

      if ($query->execute($fruitIDs)) { 

       while ($row = $query->fetch(PDO::FETCH_NUM)) { 

        $this->_fruitArray[] = $row[0]; 
       } 

      } else { 

       print_r("ERROR QUERY DID NOT EXECUTE #3"); 
      } 

     } else { 

      print_r("ERROR CHECK SQL SYNTAX #3"); 
     } 

     return $this->_fruitArray; 
    } 

我並不完全理解綁定參數的安全性好處或分支,或者只是將它們包含在實際的execute()中,但現在查詢按預期執行,因此非常感謝您的輸入!

相關問題