【发布时间】:2014-01-11 00:25:18
【问题描述】:
我正在尝试学习如何将我的查询转换为 PDO。我终于得到了一个简单的行(计数)查询,现在我正在处理更复杂的查询。
我目前正在使用以下查询。 (抱歉,它太复杂了;我仍在努力简化它。)
$SeaURL = str_replace('Washington/', '', $MyURL);
$res = mysql_query ("SELECT P.URL, P.Title, P.Subtitle, P.MetaTitle, P.MetaDesc, P.KW, P.Live, PB.Common, PB.First, PB.Middle, PB.Last, PB.Prefix, PB.Suffix, PB.Born, PB.Died, PB.Birth_Place, PB.Death_Place, PB.Nationality, Brf.Site, Brf.Brief, PC.Class, PX.Article PXA, PX.Pagedex PXP, IVR.Article IVRA, IVR.Pagedex IVRP, SM.Article SMA, SM.Pagedex SMP
FROM people P
LEFT JOIN people_1_bio PB ON PB.URL = P.URL
LEFT JOIN people_1_class PC ON PC.URL = P.URL
LEFT JOIN people_briefs Brf ON Brf.URL = P.URL
LEFT JOIN people_articles_px PX ON PX.URL = P.URL
LEFT JOIN people_articles_ivr IVR ON IVR.URL = P.URL
LEFT JOIN people_articles_sm SM ON SM.URL = P.URL
WHERE P.URL LIKE '$MyURL' AND P.Site = '$MySiteID'
GROUP BY Class") or die (mysql_error());
对于这个特定的查询,我需要一个 while 循环来定义一些值,其中一些我进一步放入数组中(例如 $ClassList 和 $ClassLinked)。
while ($row = mysql_fetch_array ($res))
{
$URL = $row['URL'];
$Title = $row['Title'];
$Class = $row['Class'];
$ClassList[] = $row['Class'];
$ClassL = str_replace(' ', '_', $Class);
$ClassLinked[] = '<a href="/People/'.$ClassL.'" title="'.$Class.'">'.$row['Class'].'</a>';
}
通过以上数据,我可以显示页面标题(例如 $Title = Carl Sagan)和他所属的类的列表(数组)(例如 $ClassList[] = 科学家 | 作家 | 政治活动家)。
这是我的 PDO 改造:
$dsn = "mysql:host=localhost;dbname=DATABASE;charset=utf8";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn,'USERNAME','PASSWORD', $opt);
$SeaURL = str_replace('Washington/', '', $MyURL);
$stm = $pdo->prepare("SELECT P.URL, P.Title, P.Subtitle, P.MetaTitle, P.MetaDesc, P.KW, P.Live, PB.Common, PB.First, PB.Middle, PB.Last, PB.Prefix, PB.Suffix, PB.Born, PB.Died, PB.Birth_Place, PB.Death_Place, PB.Nationality, Brf.Site, Brf.Brief, PC.Class, PX.Article PXA, PX.Pagedex PXP, IVR.Article IVRA, IVR.Pagedex IVRP, SM.Article SMA, SM.Pagedex SMP
FROM people P
LEFT JOIN people_1_bio PB ON PB.URL = P.URL
LEFT JOIN people_1_class PC ON PC.URL = P.URL
LEFT JOIN people_briefs Brf ON Brf.URL = P.URL
LEFT JOIN people_articles_px PX ON PX.URL = P.URL
LEFT JOIN people_articles_ivr IVR ON IVR.URL = P.URL
LEFT JOIN people_articles_sm SM ON SM.URL = P.URL
WHERE P.URL LIKE '$MyURL' AND P.Site = '$MySiteID'
GROUP BY Class");
$stm->execute();
$data = $stm->fetchAll();
我认为我的查询不起作用,但是当我不知道如何显示结果时很难检查它。这就是我在这里要问的问题。
如果我对教程@https://stackoverflow.com/tags/pdo/info 的理解正确,那么 fetchAll() 函数会替换 while 循环,对吗?
我的原始代码定义了以下值,然后我可以在单独的文件中回显:
$Class = $row['Class'];
$ClassList[] = $row['Class'];
使用我的新 PDO 脚本定义 $Class 和 $ClassList 的最佳方法是什么?
@https://stackoverflow.com/tags/pdo/info 页面提供了一个使用 foreach 函数的非常令人困惑(且不完整?)的示例...
?>
<table>
<? foreach ($data as $row): ?>
<tr>
<td>
<a href="news.php?<?=$row['id']?>">
<?=htmlspecialchars($row['name'])?>
</a>
</td>
</tr>
<? endforeach ?>
但我不会在表格中显示我的所有数据。以及如何将 $Class 定义为单个值,而将 $ClassList 定义为一系列值(数组)?
【问题讨论】:
-
fetchAll()确实替换了整个 while 循环。因此,在您的情况下,您可以将旧while循环的整个主体放入foreach ($data as $row)以获得相同的结果。 -
既然要转换为 PDO,就必须立即开始学习参数。您正在使用
prepare()/execute(),但由于您仍在直接插入变量LIKE '$MyURL' AND P.Site = '$MySiteID',因此没有获得任何安全优势 -
与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
-
我很困惑。如何将while循环的主体放入foreach?比方说,我想显示字段 $Title 中的一个值作为页面标题,并在其下列出一系列类:科学家 |作家 |政治活动家。我只是写代码 在我的查询下,然后,在我希望我的标题出现的地方,写 echo $row['Title']?我现在就简单地尝试一下,但我的查询还没有工作。我还没学过参数;在达到那个点之前,我有很多事情要解决。
-
我没有看到这个,因为你没有
@我。暂时忘记从 wiki 页面复制的foreach示例。我的意思是,如果你用foreach($data as $row)替换旧的while ($row = mysql_fetch_array ($res))fetch 循环,你最终会得到完全与旧mysql_*()代码中相同的数据结构,填充@987654340 @ 等,就像你以前一样。 (只需将while(...)替换为foreach(...)并在内部不进行任何更改。