ГДЕ gid = $ gid LIMIT 26 не работает? - PullRequest
0 голосов
/ 08 мая 2011

У меня может не быть лучшего запроса в запросе, и если кто-то может научить меня лучшему способу, который был бы оценен.

Но с тем, что у меня есть, я не могу понять, почему команда LIMITне работает?

Я ограничиваю миниатюры до 26, но получаю 38?

Очень странно.

Если это поможет, могу сказать, что таблица галереиимеет 7 опубликованных галерей, так что оттуда будет 7 идентификаторов, и я надеялся, что следующий запрос будет циклически перебирать таблицу фотографий и возвращать все фотографии с идентификаторами из 7 галерей, которые я запрашивал выше, верно?

Ну, вот мой код, если кто-нибудь может понять его ..

<?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 }} ?>  

Спасибо любому, кто может помочь пролить свет на это или предложить / научить меня лучшему способу.

Приветствия.John

Ответы [ 2 ]

2 голосов
/ 08 мая 2011

Вы делаете несколько запросов, каждый из которых индивидуально ограничен 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.

Возможно, вы можете быть уверены, что ваши идентификаторы никогда не содержат знаков препинания, но могут использоваться любые другие значения, поэтому лучше всегда использовать соответствующую кодировку всякий раз, когда вы вставляете строку текста в другой контекст, такой как SQL, HTML или URL.

Набирать 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']); ?>&amp;gid=<?php u($row2['gid']); ?>&amp;id=<?php u($row2['id']); ?>">

(обратите внимание также & в значении атрибута должно быть экранировано до &amp; для достоверности и надежности HTML.)

1 голос
/ 08 мая 2011

У вас есть несколько галерей с status, равным 1, и, следовательно, вы проходите внутренний цикл более одного раза.

...