0

您好,我不确定是否已经被问过,但我已经搜索了 20 分钟,找不到相关答案。

我试图在我的表中获取所有 thread_id,然后将它们存储到一个名为 $ids[] 的数组中

然后进行查询:

SELECT * FROM posts WHERE tid = $ids[]

基本上,我想获取所有帖子,它们的 tid 列是数组中的其中之一。

我该怎么做呢?

顺便说一句,我正在使用 PDO。

致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 C:\xampp\htdocs\bronified\index 中的第 1 行的 ''2 , 3 , 4 , 1' ORDER BY pid ASC LIMIT 10' 附近使用正确的语法。 php:77 堆栈跟踪:#0 C:\xampp\htdocs\bronified\index.php(77): PDOStatement->execute(Array) #1 {main} 在 C:\xampp\htdocs\bronified\index.php 中抛出在第 77 行

                <?php
                $test = $pdo->prepare("SELECT * FROM mybb_threads ORDER BY replies DESC LIMIT 10");
                $test->execute();

                while ($row = $test->fetch(PDO::FETCH_ASSOC))
                {
                    echo'<li><a href="#st-'.$row['tid'].'-'.$row['fid'].'">'. $row['subject'].'</a></li>';
                }   
                $get = $pdo->prepare("SELECT * FROM mybb_threads ORDER BY replies DESC LIMIT 10");
                $get->execute();                    
                $array = $get->fetchAll(PDO::FETCH_COLUMN, 0);
                ?>
            </ul>
            <?php
                $test = $pdo->prepare("SELECT * FROM mybb_threads ORDER BY replies DESC");
                $test->execute();

                $fetch = $test->fetch(PDO::FETCH_ASSOC);

                $new = $pdo->prepare("SELECT * FROM mybb_posts WHERE replyto = 0 AND tid IN :ids ORDER BY pid ASC LIMIT 10");
                $new->execute(array(":ids" => implode(" , ",$array)));

                while ($row = $new->fetch(PDO::FETCH_ASSOC))
                {
                    echo 
                    '
                        <div id="st-'.$row['tid'].'-'.$row['fid'].'">
                            <h4>'.$row['subject'].'</h4>
                            <p>
                                '.$row['message'].'
                            </p>
                        </div>
                    ';
                }
            ?>
4

3 回答 3

0

使用 IN 和内爆

$idsStr = implode(',', $tids);
$sql = "SELECT * FROM posts WHERE tid IN ($idsStr)";

编辑:假设您知道这些 id 是整数,并且您没有在其中使用任何其他准备好的语句功能,这种方式比使其成为准备好的语句更容易。如果你真的想让它成为一个准备好的声明,那么:

$idsStr = "";
foreach($tids AS $id){
    $idsStr .= "?, ";
}
$idsStr = trim($idsStr, ', ');
$sql = "SELECT * FROM posts WHERE tid IN ($idsStr)";
$sth = $dbh->prepare($sql);
foreach($tids AS $k=>$id){
    $sth->bindParam($k, $id, PDO::PARAM_INT);
}

Edit2:听起来你只需要加入。您说要从表中选择所有线程 ID:

SELECT * FROM posts INNER JOIN threads ON threads.thread_id = posts.thread_id
于 2013-06-13T20:18:49.567 回答
0
$query = "SELECT * FROM posts WHERE tid IN ".implode(" , ",$ids);

implodes 将您的 PHP 数组转换为一个包含由逗号分隔的 ID 的字符串。您只需要执行查询。

于 2013-06-13T20:20:57.543 回答
0

fetch_array -- 返回一个数组,该数组对应于使用 MYSQLI_BOTH 获取的行 Key->Value

$row = $result->fetch_array(MYSQLI_BOTH);
$ids = implode(',',$row['id']);
$sql = "SELECT * FROM posts WHERE tid IN ($ids)"
于 2013-06-13T20:32:26.883 回答