我可能没有在查询中找到最好的查询,如果有人可以教我一个更好的方式,将被赞赏。
但是我的确无法解决为什么LIMIT命令不起作用?
我将缩略图限制为26但我得到38?
非常奇怪。
如果它有帮助,我可以说画廊表有7个已发布的画廊,所以会有7个id来自那里,我希望下一个查询将循环通过照片表并返回所有照片来自上面我查询过的7家画廊的id?
如果任何人能理解它,我的代码就好了。
<?php
// Check if gallery is published
$query1 = "SELECT id,status FROM gallery WHERE status=1";
$result1 = mysql_query($query1) or die(mysql_error());
while($row1 = mysql_fetch_array( $result1 )) {
$gid = $row1['id'];
// now get the photo file names based on the above published gallery ids
$query2 = "SELECT id,uid,gid,image,origimage FROM photo WHERE gid='$gid' LIMIT 20";
$result2 = mysql_query($query2) or die(mysql_error());
while($row2 = mysql_fetch_array( $result2 )) {
?>
<div style="float:left;">
<a class="featureGrid" href="public-photo-user.html?uid=<?php echo $row2['uid']; ?>&gid=<?php echo $row2['gid']; ?>&id=<?php echo $row2['id'];?>">
<img src="media/users/croppedthumbs/<?php echo $row2['uid']; ?>/<?php echo $row2['gid'] ?>/<?php echo $row2['image']; ?>" />
</a>
</div>
<?php }} ?>
感谢任何能够帮助阐明这一点或建议/教我更好的方法。
干杯。 约翰
答案 0 :(得分:2)
您正在进行多个查询,每个查询都单独限制为20个。
而是使用连接将查询合并到单个查询中。它比循环多个查询更有效,并且您可以对组合结果设置限制:
SELECT photo.id, photo.uid, photo.gid, photo.image, photo.origimage
FROM photo JOIN gallery ON gallery.id=photo.gid
WHERE gallery.status=1
LIMIT 20
在将值放入查询字符串时,您还应始终小心使用mysql_real_escape_string()
,否则您将获得SQL注入安全漏洞。同样,您输出到HTML页面的所有文本都必须使用htmlspecialchars()
进行编码以避免标记注入,插入到URL部分的数据应使用rawurlencode()
进行编码。
ETA:
您可以将我链接到mysql_real_escape_string与htmlspecialchars相结合的示例。
好吧,如果你还在这样做,那就:
$query2 = "SELECT id,uid,gid,image,origimage FROM photo WHERE gid='$gid' LIMIT 20";
需要对其中的$gid
进行转义,否则值中的任何撇号(或可能反斜杠)都会导致它爆炸。
$query2 = "SELECT id,uid,gid,image,origimage FROM photo WHERE gid='".mysql_real_escape_string($gid)."' LIMIT 20";
然后:
href="public-photo-user.html?uid=<?php echo $row2['uid']; ?>...
如果uid
值包含双引号,则会受到攻击,而对于无效放入URL的其他各种字符也会失败。
可能您可以确定您的ID永远不会包含标点符号,但任何其他值都可能会这样做,因此每当您将一串文本插入另一个上下文(如SQL,HTML或URL)时,最好始终使用适当的编码。 / p>
但是,始终键入mysql_real_escape_string
和htmlspecialchars
有点单调乏味,所以我倾向于定义快捷函数,如:
function m($str) { return "'".mysql_real_escape_string($str)."'"; }
function h($str) { echo htmlspecialchars($str); }
function u($str) { echo rawurlencode($str); }
可以使用:
$query2 = "SELECT id,uid,gid,image,origimage FROM photo WHERE gid=".m($gid)." LIMIT 20";
Hello, <?php h($name); ?>
<a class="featureGrid" href="public-photo-user.html?uid=<?php u($row2['uid']); ?>&gid=<?php u($row2['gid']); ?>&id=<?php u($row2['id']); ?>">
(另请注意,如果HTML有效性和可靠性,属性值中的&
也应转义为&
。)
答案 1 :(得分:1)
您有多个status
为1的图库,因此不止一次经历内部循环。