簡體   English   中英

PDO-使用綁定參數執行的查詢沒有結果?

[英]PDO - executed query with binded parameters yields no results?

我正在嘗試從數據庫中創建一個包含隨機“水果”的PHP數組。

我正在使用的數據庫類:

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查詢准備並正確執行,我可以對准備和綁定進行分析,然后它們返回TRUE。 但是,在最后一個查詢上什么也沒有返回。

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

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

問題出現(我認為)與第三個查詢:

此查詢未返回任何內容。 prepare語句與exec一樣在var轉儲上返回true,但是沒有結果!

如果我手動獲取從query#2輸出的ID,然后在mysql中自己運行它,則會返回正確的“水果”名稱。

我是否錯誤地綁定了變量? 我閱讀了PHP手冊中的頁面,但顯然我做錯了。

請幫忙! :)

感謝您的常識提供的鏈接和輸入,使用以下方法:

參考-有關PDO的常見問題

我可以將數組綁定到IN()條件嗎?

我可以通過如下更改查詢來解決此問題:

//#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()中的安全性或后果,但是目前查詢正在按預期執行,因此感謝您的輸入!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM