【发布时间】:2010-12-16 00:30:00
【问题描述】:
我搜索了高低,找不到与我所拥有的类似的问题。
我是初学者,所以请原谅我笨拙的查询结构。
我正在尝试(在输出下方附加屏幕抓取):
- 查询photos表以获取基于类别id的id,并且由于分页而开始,限制。
- 根据我刚刚从第一个查询中获得的照片 ID 查询 照片标记表。
但我的问题是我无法对标签进行分组,有些照片具有相同的标签名称。输出只显示每张照片的所有标签。我希望 restaurant 只显示一次等...
<?php
// Get the file ideez and dont go beyond pagination start,limit eg:30,10
$queryFile = "SELECT id FROM $tableName WHERE cat_id=".$fileID." LIMIT $start, $limit";
$resultFile = mysql_query($queryFile);
while ($rowFile = mysql_fetch_array($resultFile)) {
// Get the tag names based on the file ideez retrived from the above query
$queryTagged = "SELECT tag_name FROM photoTagged WHERE file_id=".$rowFile['id']." GROUP BY tag_name";
$resultTagged = mysql_query($queryTagged) or die(mysql_error());
while ($rowTagged = mysql_fetch_array($resultTagged)) {
$tagged = $rowTagged['tag_name'];
?>
<li><a href="#"><?php echo $tagged; ?></li>
<?php }} ?>
上面的查询正在产生:
酒吧,卡布奇诺,咖啡,咖啡机,餐厅,酒吧,卡布奇诺,咖啡,咖啡机,餐厅,酒吧,咖啡,餐厅,酒吧,咖啡,咖啡机 餐厅、酒吧、卡布奇诺、咖啡、餐厅
我需要展示的是:
酒吧、卡布奇诺、咖啡、咖啡机、餐厅
如果有人能帮忙,我将不胜感激。
提前谢谢你。
约翰
我的新代码是
<?php
// Get the file ideez and dont go beyond pagination start,limit eg:30,10
$queryFile = "SELECT id FROM $tableName WHERE cat_id=".$fileID." LIMIT $start, $limit";
$resultFile = mysql_query($queryFile);
while ($rowFile = mysql_fetch_array($resultFile)) {
// Get the tag names based on the file ideez retrived from the above query
$queryTagged = "SELECT DISTINCT tag_name FROM photoTagged WHERE file_id=".$rowFile['id'];
$resultTagged = mysql_query($queryTagged) or die(mysql_error());
$rowTagged = mysql_fetch_array($resultTagged);
$tagged = $rowTagged['tag_name'];
?>
<li><a href="#"><?php echo $tagged; ?></li>
<?php } ?>
我现在明白了:(所以我很接近不是吗?)
--------- 卡布奇诺 餐厅 酒吧 咖啡机 餐厅 咖啡 咖啡 餐厅 餐厅 餐厅 咖啡 咖啡 餐厅 餐厅 咖啡机 餐厅 咖啡我想知道空格是不是什么东西?我是从复制和粘贴中得到的...
任何进一步的帮助将不胜感激:-)
【问题讨论】:
-
示例代码可能容易受到SQL injection的攻击,这是一个非常严重的security risk。要修复这个漏洞,请从过时的 mysql 驱动程序切换到PDO 并使用prepared statements。如果您需要 PDO 教程,请尝试 "Writing MySQL Scripts with PHP and PDO"。您保存的网站可能只是您自己的。
-
确实,这段代码正在乞求被利用。但是 OP 可能不会很快用 PDO 交换这个代码(否则他已经在使用 PDO)。因此,一个更实用且易于采用的建议:请将所有 $id 变量包装在
intval中,例如cat_id='.intval($fileID). -
谢谢outis,我还没有做realescapes并清理一下。该代码也在受密码保护的管理员内运行。那些不知道mysql和myspace之间差异的人会使用它。但我会阅读 PDO - 虽然它看起来有点超出我的联盟。有一些关于如何进行安全连接、查询和结果的简单示例代码?
-
outis 的最后一个链接看起来不错。
-
相信我:你不能相信用户。可能会出现谁知道这在做什么,或者其他人可能会闯入他们的帐户,或者某些用户的计算机可能会被worm 感染(利用SQL 注入的数量不小)。安全需要从设计过程开始就存在,而不是事后考虑或次要功能。我发现 PDO 比旧的 mysql 驱动程序更易于使用。 Query results 是 traversable,仅此而已。