Php PDO执行的带有绑定参数的查询不会产生任何结果?

Php PDO执行的带有绑定参数的查询不会产生任何结果?,php,pdo,Php,Pdo,我试图从数据库中创建一个包含随机水果的PHP数组 class FruitBasket { private $_fruitArray = array(), $_inputCode, $_db; public function __construct($input = null) { $this->_inputCode = $input; $this->_db = Db::getInstance(); var_dump($thi

我试图从数据库中创建一个包含随机水果的PHP数组

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;
}
}
我正在使用的数据库类:

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;
}
}
我正试图通过以下方法来测试这一切:

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的print语句显示表中正确的总计数

第二个查询似乎工作正常,字符串$FROUTIDS,从表中获取随机id,我可以将其返回,并确认返回的id确实正确

我认为问题出现在第三个查询中:

此查询未返回任何内容。prepare语句在var转储上返回true,execute语句也返回true,但是没有结果

如果我手动获取从query2输出的ID,并在mysql中自己运行它,则会返回正确的水果名称

我是否错误地绑定了变量?我读了几页,但很明显我做错了什么


请帮忙

感谢您的常识提供的链接和输入,请使用以下内容:

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));

我可以通过如下更改查询来解决此问题:


我不完全理解绑定参数或只是将其包含在实际执行中的安全好处或后果,但现在查询的执行符合预期,因此感谢您的输入

您可能希望删除许多代码,这些代码肯定不会像您的大多数水果列表一样导致问题。你有很多东西要读。伟大的一点布兹罗,我已经省略了一些我以前发布的内容,只是不想成为一个信息发布不足的问题之一。谢谢你的常识!我甚至都没想到要检查一下!看来他的想法可以解决我的问题?我将尝试立即修复此问题:D