Home | Registrieren | Einloggen | Suchen | Aktuelles


Forum » PHP & MySQL » Problem: Mehrfach-Ouery mit php an mysql senden. mysql 3.23, ... Antworten
Problem: Mehrfach-Ouery mit php an mysql senden. mysql 3.23, php 4.2.1

elster
Otto-Normal-Poster


Beiträge: 42


Hallo,
weiß jemand, wie ich eine Mehrfach-query mit einer
Funktion nach MYSQL bekomme?
Funktion ist aus phpmyadmin 2.2.6: PMA_splitSqlFile(&$ret, $sql, $release)
read_dump.php

Der Query sieht so aus:

$sql = "CREATE TEMPORARY TABLE tmp
(artikel INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
preis DOUBLE(16,2) DEFAULT '0.00' NOT NULL);
LOCK TABLES shop read;
INSERT INTO tmp SELECT artikel, MAX(preis)
FROM shop
GROUP BY artikel;
SELECT shop.artikel, haendler, shop.preis
FROM shop, tmp
WHERE shop.artikel=tmp.artikel AND shop.preis=tmp.preis";

weiter gehts mit

$release = "3.23.39";
$result = mysql_query(PMA_splitSqlFile(&$ret, $sql, $release))or die($sql.'<br>'.mysql_error());

hier kommt leider der Fehler:
Fehler in der Syntax bei '1' in Zeile 1 ... (In MySql-Front gibts keinen Fehler!)
>>>>> Woher der Syntaxfehler???
weiter im Code mit:

if(!$result) echo "--- nix ---";
while($print2 = mysql_fetch_row($result)) {
echo "<b>q-> </b>: ".$print2[0]."<br>"; }
echo "</font>\n";
$sqlfin = "UNLOCK TABLES;
DROP TABLE tmp";
mysql_query(PMA_splitSqlFile(&$ret, $sqlfin, $release));

>>>>> Was kann man für &$ret eintragen/übergeben? Welchen Parameter?


Kann mir jemand helfen?
Danke, Jörg

  Profil   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Du kannst mit Sicherheit die Rückgabe von PMA_splitSqlFile() nicht in mysql_query() verwenden. Ich vermute da kommt nur true/false oder halt die Anzahl. $ret ist sicher eine Variable die nach der Funktion ein Array mit den SQL-Anweisungen enthält.

Das & wird übrigens eigentlich nur in der Deklaration - nicht im Aufruf verwendet.

---
Weaverslave

  Profil   Website   Editieren   Zitieren

elster
Otto-Normal-Poster


Beiträge: 42


Hi subjective,
Super! Stimmt. Danke!

es klappt aber noch nicht ganz. Jetzt:
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in

aus dem Code:
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16:
PMA_splitSqlFile(&$ret, $sql, $release);
       $result = mysql_query($ret[0]);
       $result .= mysql_query($ret[1]);
       $result .= mysql_query($ret[2])or die($ret[0]."<br>".$ret[2]."<br>"
                             .$ret[3]."<br><br> ".$sql.'<br>'.mysql_error());
          if(!$result) echo "--- nix ---";
    while($print2 = mysql_fetch_row($result)) {
       echo "<b>q3-> </b>: ".$print2[0]."<br>";  }
       echo "</font>\n";
         $sqlfin = "UNLOCK TABLES;
                    DROP TABLE tmp";
        PMA_splitSqlFile(&$ret, $sqlfin, $release);
                 mysql_query($ret[0]);
                 mysql_query($ret[1]) or die("<br> ++ ".mysql_error());
mysql_free_result($result);
mysql_close($link);


bei den abschließenden letzten beiden querys bin ich mir unsicher, da ich
nicht weiß, wie ich sie zusammenhängend auszeichnen soll ...

ebenso subjektive Grüße,
Jörg
(jetzt hab ichs mit dem Code/BB-Tags endlich geschnallt - hoffentlich ...)

  Profil   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


$result .= mysql_query() kann nicht funktionieren. Die Rückgabe von mysql_query() ist immer eine Resoure-ID, also der Identifier für ein Ergebnis im Speicher. Der Operator .= ist ein String-Append. Die Ids werden als Strings zusammengefügt. Die Variable enthält also am Ende keine Resource-ID, sondern einen String.

Du solltest mit einer Schleife über das Array $ret gehen und nacheinander die einzelnen SQL-Queries ausführen. Damit mußt du Fehlerbehandlung und Ausgabe auch nur einmal schreiben.

---
Weaverslave

  Profil   Website   Editieren   Zitieren

elster
Otto-Normal-Poster


Beiträge: 42


mmh - Danke! Auch für die Kommentare!
zwei Fragen (Fehler) habe ich noch:

1. Das 7-teilige query-Beispiel ist ja aus:
http://www.mysql.com/.../example-Maximum-column-group-row.html
In MySQL-Front: die ersten 5 durchgespielt erzeugt die tmp-Tabelle
und mit query 6-7 entferne ich sie danach wieder.?

Wenn ich die beiden Schritte (wie unten) mit php mache,
gibts ein:
>> Tabelle 'tmp' bereits vorhanden.
Woher kommt das?


2. Ist das mysql_free_result unten notwendig? Wie sollte ein Abschluß aussehen?
>> Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in

Grüße, Jörg
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22:
$sql2 = " ... ";
$release = "3.23.39";
     PMA_splitSqlFile(&$ret, $sql2, $release);
         while (list(, $value) = each ($ret))
              foreach ($ret as $value)                 {
                 $result = mysql_query($value) or die("<br>no query: ".mysql_error());   }
          if(!$result) echo "--- nix SELECT ---<br>" or "<br> ++nix SELECT ".mysql_error();

  $print2 = mysql_fetch_array($result);
  echo "<b>sql-> </b>: ".$print2[0]." - ".$print2[1]." - ".$print2[2]."<br>";

       $sqlfin = "UNLOCK TABLES;
                     DROP TABLE tmp";
     PMA_splitSqlFile(&$ret, $sqlfin, $release);
         while (list(, $value) = each ($ret))
              foreach ($ret as $value)                 {
                 $result = mysql_query($value) or die("<br>no DROP: ".mysql_error());         }
          if(!$result) echo "--- nix DROP ---<br>";
mysql_free_result($result);
mysql_close($link);

  Profil   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


mysql_free_result() macht Sinn, wenn du ein gültiges Ergebnis hast und außerdem danach noch weiteren PHP-Quellcode ausführst. Am Ende der Scriptausführung räumt PHP selbst auf.



---
Weaverslave

  Profil   Website   Editieren   Zitieren
 

Antworten
Nach oben