Seltsames Problem bei folgender Abfrage

boyben

Mitglied
Hallo liebe Community,
ich bin hier schon fast am verzweifeln und versuche seit ca. 2 Stunden diese Abfrage ans laufen zu kriegen!
Das kuriose ist das die Abfrage in PHP-MYADMIN ohne Probleme durchläuft aber wenn ich die Query in PHP an die DB schicke bekomme ich immer folgenden Syntax Fehler:
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 ';CREATE TEMPORARY TABLE tmp_400 SELECT * FROM t_400 WHERE `t_400`.`genartnr` ='' at line 1

Hier die Abfrage:
CREATE TEMPORARY TABLE tmp_120 SELECT * FROM t_120 WHERE ktypnr = '11599';
CREATE TEMPORARY TABLE tmp_400 SELECT * FROM t_400
WHERE `t_400`.`genartnr` ='470' OR `t_400`.`genartnr`='2692' OR `t_400`.`genartnr`='3304' OR `t_400`.`genartnr`='3247' OR `t_400`.`genartnr`='508' OR `t_400`.`genartnr`='2092' OR `t_400`.`genartnr`='3545' OR `t_400`.`genartnr`='966';

SELECT t_030.beznr AS x, tmp_400.artnr AS Artikel, t_030.bez AS Kategorie
FROM tmp_120 LEFT JOIN tmp_400 ON tmp_400.kritwert = tmp_120.ktypnr LEFT JOIN t_320 ON tmp_400.genartnr = t_320.genartnr LEFT JOIN t_030 ON t_320.beznr = t_030.beznr AND t_030.sprachnr = '1'
ORDER BY t_030.bez;


Achja ich habe schon folgendes probiert half aber leider auch nicht!
evtl. Fehler durch Zeilumbrüche im Code ausgeschlossen -> habe den ganzen SQL String in einem Stück im Code stehen

Wenn mir jemand auf Anhieb sagen kann woran das liegt wäre ich sehr glücklich!
 
Zuletzt bearbeitet:
Hallo,

eventuell stört ihn das Semikolon am Anfang der Zeile.
Was sonst noch notwendig ist, aber ich ja ohne ein Stück PHP-Code nicht weiss ob du es schon machst:

Rufst du zum Maskieren der besonderen Zeichen mysql_escape_string auf ?

Markus
 
Ok hier mal der PHP Code:
Die Funktion wird über eine Xajax Funktion aufgerufen.
Als erstes wird ein Teilselektion in der t_320 vorgenommen. Daraus baue ich dann das Suchargument für die 2 Abfrage zusammen die dann fehlschlägt!
Ich könnte die Abfrage auch in einer formulieren allerdings ist das unendlich langsam da die ganzen Joins voll aufgelöst werden und nicht nur durch die Teilmengen die durch WHERE angegeben sind!

PHP:
function artikel_in_kategorien($array){
global $db;
		
		switch($array['kategorie']){
		case 1:
		// Kategorie Kühlung
		// Übergebenes Argument == 1
		$sql = "SELECT DISTINCT t_030.bez,t_320.genartnr FROM t_320
				LEFT JOIN t_030 ON t_320.beznr = t_030.beznr 
				WHERE t_030.sprachnr = '1' AND t_030.bez LIKE '%Kühlung%' 
				ORDER BY t_030.bez";
		$res = mysql_query($sql, $db);
	
		// Für das erste Ergebniss müssen wir WHERE vorne dran setzen!
		$i = 0;
		while ($row = mysql_fetch_assoc($res)){
			if ($i == 0){
				$such = " WHERE t_400.genartnr = '".$row['genartnr']."'";
			}else{
				$such .= " OR t_400.genartnr = '".$row['genartnr']."'";
			}
			$i++;
		}
		}
	$ktypnr			= $array['ktypnr'];
	
	$sql = "CREATE TEMPORARY TABLE tmp_120 SELECT * FROM t_120 WHERE ktypnr = '$ktypnr'; CREATE TEMPORARY TABLE tmp_400 SELECT * FROM t_400 $such; SELECT t_030.beznr AS x, tmp_400.artnr AS Artikel, t_030.bez AS Kategorie FROM tmp_120 LEFT JOIN tmp_400 ON tmp_400.kritwert = tmp_120.ktypnr LEFT JOIN t_320 ON tmp_400.genartnr = t_320.genartnr LEFT JOIN t_030 ON t_320.beznr = t_030.beznr AND t_030.sprachnr = '1' ORDER BY t_030.bez;";
	$res = mysql_query($sql, $db)or $content = mysql_error();
	
	
      $objResponse =  new xajaxResponse();
   // $objResponse->addWaypoint("modelldisplay", $sql2."<br />".$head.$content.$foot);
    $objResponse->addAssign("content","innerHTML", $content);
	$objResponse->addAssign("debug","innerHTML", $sql);
    return $objResponse;

}
 
Hallo,

versucht mal die Statenents deiner 2. mysql_query() auf mehrere mysql_query()-Aufrufe zu verteilen.
Welche mySQL-Version hast Du? Grundsätzlich unterstützt die MySQL 5.0+ API mehrere Statements innerhalb von mysql_query(), aber im Zweifelsfall, bzw. wenn du nicht weisst wie die Umgebung konfiguriert ist, lieber einzelne Statements benutzen

Markus
 
MYSQL Version: MySQL - 5.0.21-community-nt
PHP Version: 5.1.4

Also ich hab jezt mal das zweite SQL Statement auseinandergenommen und drei draus gemacht!
Nun klappt es einwandfrei!
Nun aber noch ne Frage zwischendurch wie lange existieren diese temporären Tabellen?
So lange bis ich die $db zumache?
Weil ich dachte ich muss diese Query in eine packen da sonst die temporären Tabellen direkt wieder gelöscht werden!

PHP:
function artikel_in_kategorien($array){
global $db;
		
		switch($array['kategorie']){
		case 1:
		// Kategorie Kühlung
		// Übergebenes Argument == 1
		$sql = "SELECT DISTINCT t_030.bez,t_320.genartnr FROM t_320
				LEFT JOIN t_030 ON t_320.beznr = t_030.beznr 
				WHERE t_030.sprachnr = '1' AND t_030.bez LIKE '%Kühlung%' 
				ORDER BY t_030.bez";
		$res = mysql_query($sql, $db);
	
		// Für das erste Ergebniss müssen wir WHERE vorne dran setzen!
		$i = 0;
		while ($row = mysql_fetch_assoc($res)){
			if ($i == 0){
				$such = " WHERE t_400.genartnr = '".$row['genartnr']."'";
			}else{
				$such .= " OR t_400.genartnr = '".$row['genartnr']."'";
			}
			$i++;
		}
		}
		// Auflösen der gewählten Kategorie wir erhalten ein SQL Suchtstring den wir anhägen!
	//$such		 	= kategorie_parser($array['kategorie']);
	$ktypnr			= $array['ktypnr'];
	
	$sql1 = "CREATE TEMPORARY TABLE tmp_120 SELECT * FROM t_120 WHERE ktypnr = '$ktypnr';";
	$sql2 = "CREATE TEMPORARY TABLE tmp_400 SELECT * FROM t_400 $such;";
	$sql3 = "SELECT t_030.beznr AS x, tmp_400.artnr AS Artikelnummer, t_030.bez AS Kategorie 
				FROM tmp_120 
				LEFT JOIN tmp_400 ON tmp_400.kritwert = tmp_120.ktypnr 
				LEFT JOIN t_320 ON tmp_400.genartnr = t_320.genartnr 
				LEFT JOIN t_030 ON t_320.beznr = t_030.beznr 
				WHERE t_030.sprachnr = '1' 
				ORDER BY t_030.bez;";
	mysql_query($sql1, $db);	
	mysql_query($sql2, $db);	
	$res = mysql_query($sql3, $db);	
	
	
	$head = "<table>
			  <tr>
				    <th>x</th>
				    <th>Artikel</th>
				    <th>Kategorie</th>
			  </tr>";
	
	$foot = "<table>";
	
	while ($row = mysql_fetch_assoc($res)){
		$content .= "<tr>
			   			<td>".$row['x']."</td>
    					<td>".utf8_encode($row['Artikelnummer'])."</td>
    					<td>".utf8_encode($row['Kategorie'])."</td>
				  	</tr>";
	}
	
	
	$objResponse =  new xajaxResponse();
   // $objResponse->addWaypoint("modelldisplay", $sql2."<br />".$head.$content.$foot);
    $objResponse->addAssign("content","innerHTML", $head.$content.$foot);
	$objResponse->addAssign("debug","innerHTML", $sql."<br />".$sql1."<br />".$sql2."<br />".$sql3);
    return $objResponse;

}
 
Hallo,

nein, bei MySQL sind es sessionbasierte temporäre Tabellen, keine transaktionsortientierten (falls du das meintest), d.h. sie ist sichtbar und gültig bis zum Disconnect.

Markus
 
Zurück