Hi Andre,
Got it to work by making a small alteration:
$forbidden_aid = array();
$result = cpg_db_query("SELECT aid FROM {$CONFIG['TABLE_ALBUMS']} WHERE alb_password = '' AND visibility > ".FIRST_USER_CAT);
while ($row = mysql_fetch_assoc($result)) {
$forbidden_aid[] = $row['aid'];
}
mysql_free_result($result);
if (count($forbidden_aid)) {
$FORBIDDEN_SET = 'AND p.aid NOT IN ('.implode(', ', $forbidden_aid).')';
} else {
$FORBIDDEN_SET = '';
}
The count is now correct, but a new issue has popped up.
I have a user gallery with only password protected albums which now shows up correctly, however when I click it there's a Critical Error processing a Database Query.
Debug mode tells me:
While executing query 'SELECT r.pid, r.aid, filepath, filename, url_prefix, pwidth, pheight, filesize, pic_rating, ctime, r.title, r.keywords, r.votes, hits, caption, r.owner_id, user1, user2, user3, user4
FROM cpg15x_pictures AS r
INNER JOIN cpg15x_albums AS a ON a.aid = r.aid
WHERE pid IN ()' in include/functions.inc.php on line 1894
mySQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 4
and that leads me pretty much to this:
//More random random photos
case 'random': // Random files
if ($cat && $CURRENT_CAT_NAME) {
$album_name = cpg_fetch_icon('random', 2) . $lang_meta_album_names['random'] . ' - ' . $CURRENT_CAT_NAME;
} else {
$album_name = cpg_fetch_icon('random', 2) . $lang_meta_album_names['random'];
}
$query = "SELECT COUNT(*)
FROM {$CONFIG['TABLE_PICTURES']} AS r
INNER JOIN {$CONFIG['TABLE_ALBUMS']} AS a ON a.aid = r.aid
$RESTRICTEDWHERE
AND approved = 'YES'";
$result = cpg_db_query($query);
list($count) = mysql_fetch_row($result);
mysql_free_result($result);
$query = "SELECT pid
FROM {$CONFIG['TABLE_PICTURES']} AS r
INNER JOIN {$CONFIG['TABLE_ALBUMS']} AS a ON a.aid = r.aid
$RESTRICTEDWHERE
AND approved = 'YES'
ORDER BY RAND()
$limit";
$result = cpg_db_query($query);
$pidlist = array();
while ($row = mysql_fetch_assoc($result)) {
$pidlist[] = $row['pid'];
}
mysql_free_result($result);
$select_columns = implode(', ', $select_column_list);
$query = "SELECT $select_columns
FROM {$CONFIG['TABLE_PICTURES']} AS r
INNER JOIN {$CONFIG['TABLE_ALBUMS']} AS a ON a.aid = r.aid
WHERE pid IN (" . implode(', ', $pidlist) . ")";
$result = cpg_db_query($query);
$rowset = cpg_db_fetch_rowset($result);
mysql_free_result($result);
shuffle($rowset);
if ($set_caption) {
build_caption($rowset, array('pic_rating', 'hits'));
}
$rowset = CPGPluginAPI::filter('thumb_caption_random', $rowset);
return $rowset;
break;
The problem is that it's trying to generate a random list from an empty array (since no photos are available to the public).
So I built in a check if there are photos to display, and if not, to return a "No image to display" message.
The new code in
functions.inc.php is now:
//More random random photos
case 'random': // Random files
if ($cat && $CURRENT_CAT_NAME) {
$album_name = cpg_fetch_icon('random', 2) . $lang_meta_album_names['random'] . ' - ' . $CURRENT_CAT_NAME;
} else {
$album_name = cpg_fetch_icon('random', 2) . $lang_meta_album_names['random'];
}
$query = "SELECT COUNT(*)
FROM {$CONFIG['TABLE_PICTURES']} AS r
INNER JOIN {$CONFIG['TABLE_ALBUMS']} AS a ON a.aid = r.aid
$RESTRICTEDWHERE
AND approved = 'YES'";
$result = cpg_db_query($query);
list($count) = mysql_fetch_row($result);
mysql_free_result($result);
//my bright idea
if ($count != 0) {
$query = "SELECT pid
FROM {$CONFIG['TABLE_PICTURES']} AS r
INNER JOIN {$CONFIG['TABLE_ALBUMS']} AS a ON a.aid = r.aid
$RESTRICTEDWHERE
AND approved = 'YES'
ORDER BY RAND()
$limit";
$result = cpg_db_query($query);
$pidlist = array();
while ($row = mysql_fetch_assoc($result)) {
$pidlist[] = $row['pid'];
}
mysql_free_result($result);
$select_columns = implode(', ', $select_column_list);
$query = "SELECT $select_columns
FROM {$CONFIG['TABLE_PICTURES']} AS r
INNER JOIN {$CONFIG['TABLE_ALBUMS']} AS a ON a.aid = r.aid
WHERE pid IN (" . implode(', ', $pidlist) . ")";
$result = cpg_db_query($query);
$rowset = cpg_db_fetch_rowset($result);
mysql_free_result($result);
shuffle($rowset);
if ($set_caption) {
build_caption($rowset, array('pic_rating', 'hits'));
}
}
$rowset = CPGPluginAPI::filter('thumb_caption_random', $rowset);
return $rowset;
break;
This seems to do the trick. It's probably not the most elegant solution, but hey
...