2011-05-08 3 views
0

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

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

Я ОГРАНИЧИВАЯ миниатюры до 26, но я получаю 38?

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

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

Ну Theres мой код если кто может иметь смысл его ..

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

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

Cheers. John

+0

есть ли у вас какие-либо ошибки? – Headshota

+0

нет ошибок, только возврат 38 миниатюр вместо 26 – jonnypixel

ответ

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.

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

Typing 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.)

+0

Вау, им действительно предстоит изучить этот вопрос. Спасибо, что это сработало очень хорошо. Можете ли вы связать меня с примером mysql_real_escape_string в сочетании с htmlspecialchars. Еще раз спасибо bobince – jonnypixel

+0

wow! снова !, извините, я не читал следующую половину вашего редактирования сообщения до сегодняшнего дня. Большое вам спасибо, это так много, и я буду помещать это в свой комплект фрагментов кода. Существуют ли другие функции, которые можно сделать так, чтобы создать более сокращенный подход при написании кода? – jonnypixel

1

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

+0

да, что имеет смысл, как я это исправить? – jonnypixel

+0

Не знаю. Что вы намеревались сделать этой странице? –

+0

Im, отображающий стену миниатюр из галерей пользователей. Но стена на самом деле является заголовком веб-сайта. Я хочу ограничить миниатюры до 26, но я не могу показать эскизы пользователей, которые, возможно, не опубликовали галерею. Соединение между таблицами - это статус, id, а во второй таблице gid совпадает с id – jonnypixel

Смежные вопросы