0

我对 PHP 真的很陌生,但我一直在尽我所能学习,但我也知道我还有很多东西要学,所以放轻松。

我目前正在编写分类广告脚本,虽然代码已经过时了,但在我开始清理它之前情况要糟糕得多,现在我只是想让分类广告再次稳定,然后我打算回去更新使用更现代的语言 (PDO),但现在我不知道从哪里开始(并且不想像我在学习 HTML、CSS、PHP 和 JS 时那样阅读几个月却一无所获)

下面的代码最初显示了它从 (tt_%s) 获取数据的表中的 Title 列,但我已经修改了将数据插入 DB 的表单,所以现在不再有“Title”列并且在现在有一张桌子的年份和型号,另一张桌子的制造商,但这是我感到困惑并寻求帮助的地方。

目前这就是我正在看的;(下面的代码我会解释更多)

<?php
echo  "<div class='mostPopular'>";
echo  "Popular<br>Listings";

$node = new sqlNode();
$node->table = "types";
$node->select = "ID";
$node->orderby = "ORDER BY rand()";

    if(($typeRS = $mysql->select($node)) === false )
        die('Unable to Retrieve Ad Type');

    $sql = array();
    $typeID = 0;
        while( $adType = mysql_fetch_assoc($typeRS) ){
            $typeID = sprintf("`tt_%s`", abs(intval($adType['ID'])));       
            $sql[] = sprintf("SELECT %s.Year, %s.Hits, %s.CategoryID, %s.ID, CONCAT('','%s') AS TypeID FROM %s WHERE (`ExpireDate` > NOW()) ",
                                $typeID,
                                $typeID,
                                $typeID,
                                $typeID,
                                intval($adType['ID']),
                                $typeID);

        }

    $sqlStr = @implode("union ",$sql);
    $sqlStr .= " ORDER BY Hits DESC LIMIT 5";

    if(($adRS = $mysql->exSql($sqlStr)) === false)
        die('Unable to Retrieve Most Popular Ads');

    while( $ad = mysql_fetch_assoc($adRS) ){
        echo "<p>";
        echo "<a href='detail.php?fatherID=".$ad['CategoryID']."&amp;TypeID=".$ad['TypeID']."&amp;ListingID=".$ad['ID']."'>";
        echo $ad['Title'];
        echo "</a>";
        echo "</p>";
    }
    echo "</div>";
?>

对于初学者,我不知道 CONCAT('','%s') 是什么,也不知道 $sqlStr = @implode("union ",$sql); 是所有关于。

除了这些问题,考虑到这段代码已经过时并且我应该切换到 PDO,我希望有人可以准确地告诉我如何使用 PDO 执行这些查询,然后我可以通过示例学习并将相同的过程应用于其他查询整个网站。

如果有人不介意与我交谈到我可以使用 PDO 执行相同结果的程度,我将不胜感激,并在我热切等待您的回复时提前感谢大家。

顺便说一句,在研究了过去几个月我能找到的所有 PHP 和 MySql 教程后,我问了这个问题

谢谢

4

1 回答 1

0

尽管“请将此代码重写为 PDO”过于本地化,但您遇到的真正问题需要不同的解决方案。

首先,您需要修复您的数据库架构。它是可怕的。

过早的优化,是万恶之源,使您堕落了正确的道路。如果您无论如何都要合并它们,那么将数据分成小块是没有意义的。

您必须为广告准备一张桌子。
它将使所有这些代码过时,只留下一个可以在一个常规 PDO 调用中运行的常规查询。

接下来,这段代码是由一些 sprintf() 狂人编写的,他们不知从何而来使其过于复杂。事实上,这里真的不需要一个 sprintf()。

$sql = array();
while( $row = mysql_fetch_assoc($typeRS) ){
    $typeID = abs($row['ID']);
    $sql[]  = "SELECT Year, Hits, CategoryID, ID, '$typeID' AS TypeID 
                 FROM tt_$typeID WHERE ExpireDate > NOW()";
}
$sqlStr = implode("union ",$sql)." ORDER BY Hits DESC LIMIT 5"

足够的。

但同样,不需要这个联合查询。一切都必须通过像这样的单个普通查询来执行

SELECT Year, Hits, CategoryID, ID, TypeID FROM ads ORDER BY Hits DESC LIMIT 5

毫无疑问,您将能够使用您拥有的任何 PDO 示例来运行它

于 2013-04-02T13:38:46.063 回答