【问题标题】:Print only one result of a query using PHP and mySQL?使用 PHP 和 mySQL 只打印一个查询结果?
【发布时间】:2014-10-02 19:10:47
【问题描述】:

我正在使用 mySQL 和 PHP,我遇到了一个整天都在思考的查询,我不确定我的困难是否在于不知道可能为此请求的一些高级命令,请问帮忙?

事情是这样的:我正在使用一个旧数据库,我不想更改其中的表,所以我必须使用两个表:

  • album:这个表只有两个字段,id_album和album_name;
  • photos:此表包含照片的路径,并通过字段 id_album 链接到相册表;

我想建立一个页面,列出所有相册,每个相册都有一个缩略图,我从“照片”表中获取,在这种情况下,我只需要为每个相册列出一张照片,而且我不确定如何为此编写代码,这是我目前得到的:

  <?php

  $comando = "SELECT * FROM album";

    $consulta = mysql_query($comando, $database)

        or die('Error:<br/>'.$comando);

    while($dados = mysql_fetch_array($consulta)) {


        $comando1 = "SELECT * FROM photos WHERE album = '".$dados['id_album']."'";
        $consulta1 = mysql_query($comando1, $database)
        or die('Error'.$comando1);

        while($dados1= mysql_fetch_array($consulta1)){          
          print '<li><a href="photos.php?Cod='.$dados['id_album'].'"><img src="'.$dados1['foto'].'"/></a><br/><a href="photos.php?Cod='.$dados['id_album'].'"> ' .$dados['album_name']. '</a></li>';

    }}

    ?>

它工作正常,但它列出了所有相册中的所有照片。有没有办法让它为每个相册打印一张照片?

非常感谢您!

【问题讨论】:

  • 这看起来非常不安全。你确定你的用户参数是properly escaped吗? mysql_query 是一个过时的接口,不应在新应用程序中使用,并将在未来的 PHP 版本中删除。像PDO is not hard to learn 这样的现代替代品。如果您是 PHP 新手,PHP The Right Way 之类的指南可以帮助您解释最佳实践。
  • 请显示您的album 表的结构。另外,您希望在每个相册中看到哪张照片 - 第一张、最后一张、随机的、最小的等等?
  • 非常感谢,我不知道 mysql_query 已经过时了,我很久以前就开始使用它了,我刚刚开始重新编程,所以我非常感谢你发给我的教程!我一定会开始更新我的技能!

标签: php mysql logic


【解决方案1】:
$comando1 = "SELECT * FROM photos WHERE album = '".$dados['id_album']."' LIMIT 1";

您应该加入查询。使用类似的东西

$comando = "
   SELECT album.id_album, photos.* FROM `album` 
   LEFT JOIN `photos` on photos.album = album.id_album
   GROUP BY album.id_album";

【讨论】:

  • 非常感谢您的帮助,我不知道“LIMIT”这么简单的解决方案的存在!
【解决方案2】:
while($dados = mysql_fetch_array($consulta)) {

$comando1 = "SELECT * FROM photos WHERE album = '".$dados['id_album']."' LIMIT 1 order by rand()";
$consulta1 = mysql_query($comando1, $database) or die('Error'.$comando1);

$dados1= mysql_fetch_row($consulta1);        
print '<li><a href="photos.php?Cod='.$dados['id_album'].'"><img src="'.$dados1['foto'].'"/></a><br/><a href="photos.php?Cod='.$dados['id_album'].'"> ' .$dados['album_name']. '</a></li>';

}

但你真的应该使用 MySqli 或其他东西..

【讨论】:

  • 非常感谢!!我还有一个问题要问你,我使用了 mysql_fetch_row 但它不起作用,我切换到 mysql_fetch_array 进行测试,它起作用了,你知道为什么吗?再次感谢!!
【解决方案3】:

是的,您使用单个查询与 GROUP_CONCAT 获取相册照片并使用 SUBSTRING_INDEX 选择一张照片

SELECT a.* ,SUBSTRING_INDEX(GROUP_CONCAT(p.foto),',',1) AS foto
FROM album a
LEFT JOIN photos p ON(a.id_album = p.id_album)
GROUP BY a.id_album

您还可以通过照片表中的自动增量列在GROUP_CONCAT 中指定ORDER BY,以选择最新的或第一个作为GROUP_CONCAT(p.foto ORDER BY p.id DESC)。此外,正如在cmets 中提到的tadman,您正在使用折旧的mysql_* 家庭功能更好从 PDO 开始

<?php

$dbh = new PDO('mysql:host=yourhost;dbname=dbname', 'user', 'pass');
$sth = $dbh->prepare("SELECT a.* ,SUBSTRING_INDEX(GROUP_CONCAT(p.foto),',',1) AS foto
FROM album a
LEFT JOIN photos p ON(a.id_album = p.id_album)
GROUP BY a.id_album
");
$sth->execute();
$result = $sth->fetchAll(); 

foreach($result as $res){

  echo '<li><a href="photos.php?Cod='.$res['id_album'].'"><img src="'.$res['foto'].'"/></a><br/><a href="photos.php?Cod='.$res['id_album'].'"> ' .$res['album_name']. '</a></li>';
}
?>

PDO::errorInfo

同样在开发过程中,您应该在执行前注意错误

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 
if (!$sth) { 
    echo "\nPDO::errorInfo():\n"; 
    print_r($dbh->errorInfo()); 
} 

【讨论】:

  • 非常感谢!!!我停止使用 mySQL 和 PHP 5 年了,所以我很高兴我在这里发表了我的疑问,所以你们可以告诉我我需要多少更新我的研究!非常感谢您的帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多