mysql query liefert falsche Ergebnisse

AgentSandsLady

Grünschnabel
Hallo,
ich hoffe, ihr könnt mir helfen.

Ich code zur Zeit an einem Banner Rotations Skript (für fanlistings).

In der display.php, die man per iframe - oder valid xhtml 1.1 mit object - in seine Seite einfügt mit einem <object data="http://fansfansfans.net/display.php?id=52" type="text/html" style="height: 60px">, kommt es nun zu einem Fehler.

Ich sende die ID mit, um danach nur Mitglieder der Kategorien, der das fanlisting angehört, anzeigen zu lassen und diese ID auszuschließen.
Außerdem sollen nur fanlistings angezeigt werden, die schon freigeschaltet, also approved sind.

Mein Problem ist nun:
es werden zwar die richtigen Kategorien ausgewählt,
jedoch wird auch das fanlisting mit der ID selbst angezeigt obwohl es 1. ja die ID hat und 2. noch garnicht freigeschaltet ist.

So sieht die Tabelle aus (wegen der Feld-Namen)
Code:
// create table for exchange
$rot_query = "CREATE TABLE `".$rot_tablename."` (" .
  '  `title` varchar(255) default \'\',' .
   '   `memberemail` varchar(255) default \'\',' .
   ' `memberurl` varchar(255) default \'\',' .
   ' `memberbanner` varchar(255) default \'\',' .
  '  `approved` tinyint(1) NOT NULL default \'0\',' .
   ' `id` int(10) NOT NULL auto_increment,' .
   ' `cat` int(10) varchar(255) default \'\',' .
   ' `password` varchar(255) default \'\',' .
     'PRIMARY KEY  (`id`)' .
      ') TYPE=MyISAM AUTO_INCREMENT=1';

und so ist mein code der display.php:

Code:
php include('rotationally/config.php');

$rot_id=$_GET['id'];

$rot_result=mysql_query("SELECT cat FROM ".$rot_tablename." WHERE id='$rot_id'");
$rot_num=mysql_num_rows($rot_result);
$rot_j=0;
while ($rot_j < $rot_num) {
$rot_cat=mysql_result($rot_result,$rot_j,"cat");

ob_start(); 
$rot_categories = explode( '-', trim($rot_cat, '-') );
foreach ($rot_categories as $value) {
$rot_onecat = "$value";
echo "OR cat LIKE '%-". $rot_onecat. "-%' ";
}


$getcats = ob_get_contents();
ob_end_clean(); 
echo $rot_id;

$rot_sql="SELECT * FROM ".$rot_tablename." WHERE approved=1 AND id!='". $rot_id ."' AND cat LIKE '%-0-%' $getcats ORDER BY RAND() LIMIT 1";
$rot_result = mysql_query($rot_sql) OR die(mysql_error());
while($rot_row = mysql_fetch_assoc($rot_result)) {
      echo "<div id=\"bottom\"><a href=\"".$rot_row['memberurl']."\"><img src=\"rotationally/images/" .$rot_row['memberbanner']. "\" alt=\"".$rot_row['memberurl']."\" /></a></div>";  
}

$rot_j++;
}

(ich weiß, die ID müsste ich noch vor ungebetenem Input säubern...das baue ich danach noch ein).

Die Kategorien werden per multiple select vorher in Form von -1-3-6- in das cat Feld eingegeben. Daher das Drama mit dem ob_get_contents und das dann in die mysql query gebracht...wenn es da eine besser Lösung gibt, immer her damit!

Das echo $rot_id habe ich nur dazu geschrieben, damit man sehen kann, ob an der Stelle die ID noch korrekt übergeben wird. Und ja, sie wird.

Das Problem ist nun aber, dass trotz dem where approved=1 und dem id!=$rot_id auch approved=0 und id=$rot_id angezeigt wird. Irgendeine idee
 
Was steht denn in deiner cat drin? Zahlen oder was? Weil ich frag mich warum du dir das so schwer machst.
 
Ja, in der cat steht sowas wie

-1-4-5-

das wird auf der join Seite mit

Code:
$rot_cat = "-". implode('-',$_POST['cat']) ."-";
$rot_cat = clean($rot_cat);

aus dem multiple select Feld (weil mehrere Kategorien möglich sein sollen) rausgelesen und in die Datenbank gepackt.

damit ich dann nach sowas wie like %-4-% suchen kann.
Davor hatte ich immer nach like 4 gesucht, aber dann auch gleich die 14 und 24 und 40 und sowas als Ergebnis. Daher habe ich es so gemacht.

Angucken kann man sich das sonst hier:

http://fansfansfans.net/index.php -
es funktioniert aber noch nichts außer das join.

Ich denke aber - mal abgesehen davon, dass ich meine Lösung mit den Kategorien ganz furchtbar finde - dass das nichts mit dem anderen zu tun hat, oder?



Ich mache mir das übrigens so kompliziert, weil ich es nicht besser weiß - das ist quasi mein zweites Skript.:-(
 
habs jetzt zu

Code:
$rot_sql="SELECT * FROM ".$rot_tablename." WHERE approved = '1' AND id != '". $rot_id ."' AND cat LIKE '%-0-%' $getcats ORDER BY RAND() LIMIT 1";

geändert, ist aber leider noch immer so. Ohne die Leerzeichen aber mit ' hatte ich es schon.
 
bei der Version, war es aber noch nicht so.
Kannst du mal ein wenig Inhalt deiner Tabelle hier posten, dann kann ich es mal zu Hause ausprobieren.
 
Zuletzt bearbeitet:
Ja, ich hatte mich für eine Version meines befehls entschieden ;)

Oh, ausprobieren wäre toll. Hier ist die ganze Tabelle:

Code:
CREATE TABLE `rotationally` (
  `title` varchar(255) NOT NULL default '',
  `memberemail` varchar(255) NOT NULL default '',
  `memberurl` varchar(255) NOT NULL default '',
  `memberbanner` varchar(255) NOT NULL default '',
  `approved` tinyint(1) NOT NULL default '0',
  `id` int(10) NOT NULL auto_increment,
  `cat` varchar(100) NOT NULL default '1',
  `password` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=59 ;


INSERT INTO `rotationally` VALUES ('Architecture', 'martina@inspirationally.org', 'http://inspirationally.org/architecture/', '50_Architecture.gif', 1, 50, '-9-11-', '');
INSERT INTO `rotationally` VALUES ('Black Pearl', 'martina@inspirationally.org', 'http://inspirationally.org/blackpearl/', '58_BlackPearl.gif', 0, 58, '-2-', '327156ab287c6aa52c8670e13163fc1bf660add4');
INSERT INTO `rotationally` VALUES ('Vanessa Paradis', 'martina@inspirationally.org', 'http://inspirationally.org/vanessa/', '13_VanessaParadis.jpg', 1, 13, '-1-6-14-', '');
INSERT INTO `rotationally` VALUES ('Antonio Banderas', 'martina@inspirationally.org', 'http://inspirationally.org/antonio/', '12_AntonioBanderas.gif', 1, 12, '-1-6-', '');
INSERT INTO `rotationally` VALUES ('Mort Rainey', 'martina@inspirationally.org', 'http://inspirationaly.org/mortrainey/', '31_MortRainey.png', 1, 31, '-2-', '');
INSERT INTO `rotationally` VALUES ('Alan Silvestri', 'martina@inspirationally.org', 'http://inspirationally.org/alansilvestri/', '52_AlanSilvestri.jpg', 0, 52, '-6-', '327156ab287c6aa52c8670e13163fc1bf660add4');
INSERT INTO `rotationally` VALUES ('Black Pearl', 'martina@inspirationally.org', 'http://inspirationally.org/blackpearl/', '53_BlackPearl.gif', 0, 53, '-2-', '327156ab287c6aa52c8670e13163fc1bf660add4');
INSERT INTO `rotationally` VALUES ('Mark Dacascos', 'martina@inspirationally.org', 'http://inspirationally.org/markdacascos/', '40_MarkDacascos.gif', 1, 40, '-1-10-', '327156ab287c6aa52c8670e13163fc1bf660add4');
INSERT INTO `rotationally` VALUES ('Once upon a time in Mexico', 'martina@inspirationally.org', 'http://inspirationally.org/ouatim/', '51_OnceuponatimeinMexico.jpg', 1, 51, '-2-', '19fff1dff1da16d5c19d0c5f9cb8cba744971e59');

Der korrekte include Code für Nr. 52 sähe z.B. so aus:

Code:
<!--FANS FANS FANS exchange code begin-->
<div style="height:15px;margin:0"><a href="http://fansfansfans.net/" title="FANS FANS FANS"><img src="http://fansfansfans.net/fansfansfans1.gif" style="border-width:0;height:15px" alt="FANS FANS FANS" /></a></div> <object data="http://fansfansfans.net/display.php?id=52" type="text/html" style="height: 60px"></object>
<!--FANS FANS FANS exchange code end-->

die display.php ist wie schon geschrieben, die Bilder brauchst du ja nicht, aber der Link zu http : //inspirationally.org/ alansilvestri/ dürfte eigentlich nicht auftauchen. nur zu antonio und vanessaparadis, die dieselbe Kategorie haben.


Danke für die liebe Hilfe!! :)
 
Hm. Ich glaube, ich habe es gerade gelöst. Zumindest kam nach 10mal aktualisieren nichts falsches:

ich habe es jetzt so rum:

Code:
$rot_sql="SELECT * FROM ".$rot_tablename." WHERE cat LIKE '%-0-%' $getcats AND approved = '1' AND id != '". $rot_id ."' ORDER BY RAND() LIMIT 1";

und es geht.

Muss man das kapieren?
vielleicht, weil dieses LIKE '%-0-%' $getcats ja bedeutet LIKE '%-0-%' OR cat LIKE wasauchimmer für jede Kategorie, in der das fanlisting ist.
Und die Datenbank hat es falsch rum verstanden und and and and OR einzeln genommen, obwohl das and or am Ende ja zusammengehört.
Gibt es eine Möglichkeit, das sozusagen "einzuklammern",
damit ich, wenn ich "Eis mit Streuseln oder Sahne" sage, nicht eventuell nur Sahne bekomme?

Wenn allerdings jemand noch eine besser Lösung für diesen Kram zuvor hat, immer her damit.
Dieses '%-0-%' ist z.B. nur als Platzhalter darin, damit ich dahinter dann die ganzen OR cat like kategorien haben kann.
 
Da war ich wohl zu langsam, nach du kannst es natürlich in Klammern setzten also so z.B.

Code:
 ( cat LIKE '%-0-%' $getcats )
 
Zurück