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 语句在 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() 中的安全优势或后果,但现在查询正在按预期执行,所以感谢您的输入!