в то время как ($ stmt-> fetch ()) повторяется только один раз - PullRequest
2 голосов
/ 25 января 2012

Я использую while($stmt->fetch()) для зацикливания результатов, полученных от MySQL Query, и при определенных условиях я получаю только один результат.
Я предполагаю, что это потому, что у меня 2$stmt s.но я думал, что такого рода вещи были поддержаны.Я предполагаю, что я делаю ошибку новичка, я слишком долго привык к неподготовленным заявлениям!

    $db = mysqlConnect();
    $stmt = $db->stmt_init();
    $stmt->prepare("SELECT id, uploadtype FROM uploads ORDER BY displayorder DESC");
    $stmt->execute();
    $stmt->bind_result($id, $uploadtype);
    while ($stmt->fetch()) {
        echo 'ID = ' . $id . '<br />';
        if ($uploadtype == 'single') {
            $stmt->prepare("SELECT title, description FROM singles WHERE id = ?");
            $stmt->bind_param('i', $id);
            $stmt->execute();
            $stmt->bind_result($title, $description);
            $stmt->fetch();
            ?>
            Title: <? echo $title; ?><br />
            Description: <? echo $description; ?><br />
            <a href="edit.php?id=<? echo $id; ?>">Edit</a><br />
            <?
        }
    }

Это только один идентификатор эха.Я предполагаю, что это проблема, потому что, когда я использую следующее, я получаю все идентификаторы.

$db = mysqlConnect();
$stmt = $db->stmt_init();
$stmt->prepare("SELECT id, uploadtype FROM uploads ORDER BY displayorder DESC");
$stmt->execute();
$stmt->bind_result($id, $uploadtype);
while ($stmt->fetch()) {
    echo 'ID = ' . $id . '<br />';
}

Как я могу обойти эту проблему?Я думаю, что не совсем правильно понимаю подготовленные утверждения.
РЕДАКТИРОВАТЬ:
Теперь изменился на это, но получил invalid object or resource mysqli_stmt в строке, начиная с <error>.

$db = mysqlConnect();
    $stmt = $db->stmt_init();
    if (!$limit) {
        $stmt->prepare("SELECT id FROM uploads WHERE uploadtype = 'youtube' ORDER BY displayorder DESC");
    } else {
        $stmt->prepare("SELECT id FROM uploads WHERE uploadtype = 'youtube' ORDER BY displayorder DESC LIMIT 0, ?");
        $stmt->bind_param('i', $limit);
    }
    $stmt->execute();
    $stmt->bind_result($id);
    while ($stmt->fetch()) {
        $stmt2 = $db->stmt_init();
        $stmt2->prepare("SELECT title, description, url FROM youtube WHERE id = ?");
        <error>$stmt2->bind_param('i', $id);
        <error>$stmt2->execute();
        <error>$stmt2->bind_result($title, $description, $url);
        <error>while ($stmt2->fetch()) {
            $title = stripslashes($title);
            $description = stripslashes($description);
            $url = stripslashes($url);
            ?>
            <class id="item">
                <?
                if ($gettitle) echo 'Title: ' . $title . '<br/>';
                if ($getdescription) echo 'Description: ' . $description . '<br />';
                ?>
                <iframe width="560" height="315" src="<? echo $url; ?>" frameborder="0" allowfullscreen></iframe>
            </class><br />
            <?
        }
    }

Ответы [ 2 ]

3 голосов
/ 25 января 2012

Вам нужна другая переменная оператора.Замените второе использование (SELECT title...) на отдельную переменную (например, $stmt2 из-за отсутствия лучшего имени).

    if ($uploadtype == 'single') {
        $stmt2 = $db->stmt_init();
        $stmt2->prepare("SELECT title, description FROM singles WHERE id = ?");
        $stmt2->bind_param('i', $id);
        ...

В противном случае следующий fetch во внешнем цикле запускается противвторое утверждение.

1 голос
/ 25 января 2012

Не используйте одно и то же имя переменной ($stmt), если вы выполняете такие вложенные запросы. Назовите внутреннее утверждение как-то иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...