【问题标题】:PDO Presentation Suggestions?PDO 演示建议?
【发布时间】: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(...) 并在内部不进行任何更改。

标签: php pdo


【解决方案1】:

使用 PDOStatement fetch 函数。在您的 PDO 改造代码中,删除该行

$data = $stm->fetchAll();

使用

while( $row = $stm->fetch(PDO::FETCH_ASSOC ) {

而不是在循环的开头处理值。

还有一个更好的方法来使用prepare()

$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 :url AND P.Site = :site
GROUP BY Class',
array( ) );

$stm->execute( array( ':url'=> $MyURL, ':site' => $MySiteID ) );

while( $row = $stm->fetch(PDO::FETCH_ASSOC ) {

    // your loop here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2016-02-12
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多