/* set application name and version information */
$this->cfg->product = "phpfspot";
- $this->cfg->version = "1.1";
+ $this->cfg->version = "1.2";
/* Check necessary requirements */
if(!$this->checkRequirements()) {
require_once "phpfspot_tmpl.php";
$this->tmpl = new PHPFSPOT_TMPL($this);
+ /* check if all necessary indices exist */
+ $this->checkDbIndices();
+
$this->get_tags();
session_start();
$this->avail_tags = Array();
$count = 0;
- $result = $this->db->db_query("
- SELECT id,name
- FROM tags
- ORDER BY sort_priority ASC
- ");
+ if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str="
+ SELECT
+ DISTINCT t1.id as id, t1.name as name
+ FROM
+ photo_tags pt1
+ INNER JOIN photo_tags
+ pt2 ON pt1.photo_id=pt2.photo_id
+ INNER JOIN tags t1
+ ON t1.id=pt1.tag_id
+ INNER JOIN tags t2
+ ON t2.id=pt2.tag_id
+ WHERE
+ t2.name IN ('".implode("','",$this->cfg->show_tags)."')
+ ORDER BY
+ t1.sort_priority ASC";
+
+ $result = $this->db->db_query($query_str);
+ }
+ else
+ {
+ $result = $this->db->db_query("
+ SELECT id,name
+ FROM tags
+ ORDER BY sort_priority ASC
+ ");
+ }
while($row = $this->db->db_fetch_object($result)) {
if(in_array($row['name'], $this->cfg->hide_tags))
continue;
- /* if the user has specified to only show certain tags which
- are specified in phpfspot's configuration, ignore all others
- so they will not be added to the tag list.
- */
+ /* if you include the following if-clause and the user has specified
+ to only show certain tags which are specified in phpfspot's
+ configuration, ignore all others so they will not be added to the
+ tag list.
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags) &&
!in_array($row['name'], $this->cfg->show_tags))
continue;
+ */
$this->tags[$tag_id] = $tag_name;
$this->avail_tags[$count] = $tag_id;
INNER JOIN tags t
ON pt.tag_id=t.id
WHERE p.id='". $idx ."'
- AND t.name IN (
- ";
- foreach($this->cfg->show_tags as $tag) {
- $query_str.= "'". $tag ."',";
- }
- $query_str = substr($query_str, 0, strlen($query_str)-1);
- $query_str.= ")";
+ AND t.name IN ('".implode("','",$this->cfg->show_tags)."')";
}
else {
$query_str.= "
/* return a search result */
if(isset($_SESSION['searchfor']) && $_SESSION['searchfor'] != '') {
$query_str = "
- SELECT DISTINCT photo_id
- FROM photo_tags pt
+ SELECT DISTINCT pt1.photo_id
+ FROM photo_tags pt1
+ INNER JOIN photo_tags pt2
+ ON pt1.photo_id=pt2.photo_id
+ INNER JOIN tags t1
+ ON pt1.tag_id=t1.id
INNER JOIN photos p
- ON p.id=pt.photo_id
- INNER JOIN tags t
- ON pt.tag_id=t.id
- WHERE t.name LIKE '%". $_SESSION['searchfor'] ."%'";
+ ON pt1.photo_id=p.id
+ INNER JOIN tags t2
+ ON pt2.tag_id=t2.id
+ WHERE t1.name LIKE '%". $_SESSION['searchfor'] ."%' ";
if(isset($additional_where_cond))
$query_str.= "AND ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
- $query_str.= "AND t.name IN (";
- foreach($this->cfg->show_tags as $tag) {
- $query_str.= "'". $tag ."',";
- }
- $query_str = substr($query_str, 0, strlen($query_str)-1) . ")";
+ $query_str.= "AND t2.name IN ('".implode("','",$this->cfg->show_tags)."')";
}
if(isset($order_str))
$selected.= $tag .",";
$selected = substr($selected, 0, strlen($selected)-1);
+ /* photo has to match at least on of the selected tags */
if($_SESSION['tag_condition'] == 'or') {
$query_str = "
- SELECT DISTINCT pt.photo_id
- FROM photo_tags pt
- INNER JOIN photos p
- ON p.id=pt.photo_id
+ SELECT DISTINCT pt1.photo_id
+ FROM photo_tags pt1
+ INNER JOIN photo_tags pt2
+ ON pt1.photo_id=pt2.photo_id
INNER JOIN tags t
- ON pt.tag_id=t.id
- WHERE pt.tag_id IN (". $selected .")
+ ON pt2.tag_id=t.id
+ INNER JOIN photos p
+ ON pt1.photo_id=p.id
+ WHERE pt1.tag_id IN (". $selected .")
";
if(isset($additional_where_cond))
$query_str.= "AND ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
- $query_str.= "AND t.name IN (";
- foreach($this->cfg->show_tags as $tag) {
- $query_str.= "'". $tag ."',";
- }
- $query_str = substr($query_str, 0, strlen($query_str)-1) . ")";
+ $query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags)."')";
}
if(isset($order_str))
$query_str.= $order_str;
}
+ /* photo has to match all selected tags */
elseif($_SESSION['tag_condition'] == 'and') {
if(count($_SESSION['selected_tags']) >= 32) {
INNER JOIN photos p
ON pt1.photo_id=p.id
";
- $query_str.= "WHERE pt1.tag_id=". $_SESSION['selected_tags'][0];
+ $query_str.= "WHERE pt2.tag_id=". $_SESSION['selected_tags'][0]." ";
for($i = 1; $i < count($_SESSION['selected_tags']); $i++) {
$query_str.= "
- AND pt". ($i+1) .".tag_id=". $_SESSION['selected_tags'][$i] ."
+ AND pt". ($i+2) .".tag_id=". $_SESSION['selected_tags'][$i] ."
";
}
if(isset($additional_where_cond))
$query_str.= "AND ". $additional_where_cond;
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
- $query_str.= "AND t.name IN (";
- foreach($this->cfg->show_tags as $tag) {
- $query_str.= "'". $tag ."',";
- }
- $query_str = substr($query_str, 0, strlen($query_str)-1) . ")";
+ $query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags). "')";
}
if(isset($order_str))
$query_str.= "WHERE ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
- $query_str.= "AND t.name IN (";
- foreach($this->cfg->show_tags as $tag) {
- $query_str.= "'". $tag ."',";
- }
- $query_str = substr($query_str, 0, strlen($query_str)-1) . ")";
+ $query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags). "')";
}
if(isset($order_str))
*/
public function get_thumb_path($width, $photo)
{
- $sub_path = substr($this->getMD5($photo), 0, 2);
+ $md5 = $this->getMD5($photo);
+ $sub_path = substr($md5, 0, 2);
return $this->cfg->thumb_path
. "/"
. $sub_path
. "/"
. $width
. "_"
- . $this->getMD5($photo);
+ . $md5;
} // get_thumb_path()
} // check_readable()
+ /**
+ * check if all needed indices are present
+ *
+ * this function checks, if some needed indices are already
+ * present, or if not, create them on the fly. they are
+ * necessary to speed up some queries like that one look for
+ * all tags, when show_tags is specified in the configuration.
+ */
+ private function checkDbIndices()
+ {
+ $result = $this->db->db_exec("
+ CREATE INDEX IF NOT EXISTS
+ phototag
+ ON
+ photo_tags
+ (photo_id, tag_id)
+ ");
+
+ } // checkDbIndices()
+
}
?>