[MySQL][PHP] Add query in nestedstructuur werkt niet in PHP

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • LocoShady
  • Registratie: Mei 2003
  • Laatst online: 04-05 19:31
Hello,

Een vraag. Ik heb vandaag lopen puzzelen met hierargische data in MySQL (tutorial: http://dev.mysql.com/tech...es/hierarchical-data.html) Maar nu ben ik tegen een probleem aangelopen waar ik niet veel van snap.

Ik probeer een node toe te voegen met de volgende query:
PHP:
1
LOCK TABLE nestedpages WRITE; SELECT @myRight := rgt FROM nestedpages WHERE nestedpage_name = 'page4'; UPDATE nestedpages SET rgt = rgt + 2 WHERE rgt > @myRight; UPDATE nestedpages SET lft = lft + 2 WHERE lft > @myRight; INSERT INTO nestedpages(nestedpage_name, lft, rgt) VALUES('diepe page2', @myRight + 1, @myRight + 2); UNLOCK TABLES;


Echter als ik deze query via PHP uitvoer verschijnt er geen nieuwe node. Voer ik exact dezelfde query uit in een MySQL client, verschijnt er prompt een nieuwe node. Beiden gebruiken dezelfde user.

In PHP krijg ik de volgende foutmelding:
'SELECT @myRight := rgt FROM nestedpages WHERE nestedpage_name = 'page4'; UPDATE ' at line 1

Iemand enig idee waar dit aan kan liggen? Ik zie er persoonlijk weinig verkeerds daar aan (helemaal omdat het via de mysql client prima werkt)

Acties:
  • 0 Henk 'm!

  • DR
  • Registratie: December 2000
  • Niet online

DR

Je gebruikt mysql_query en wil die query met 1x mysql_query() uitvoeren?
mysql_query() sends a unique query (multiple queries are not supported)
http://nl3.php.net/mysql_query

Acties:
  • 0 Henk 'm!

  • LocoShady
  • Registratie: Mei 2003
  • Laatst online: 04-05 19:31
DR schreef op donderdag 16 juni 2011 @ 22:03:
Je gebruikt mysql_query en wil die query met 1x mysql_query() uitvoeren?


[...]

http://nl3.php.net/mysql_query
Zucht, soms kan het zo voor de hand liggen. _O_
Er zit dus niks anders op dan het op deze manier te doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
            $sQuery0 = "LOCK TABLE nestedpages WRITE;";
            $sQuery1 = "SELECT @myLeft := lft FROM nestedpages WHERE nestedpage_name = '".$sParentName."';";            
            $sQuery2 = "UPDATE nestedpages SET rgt = rgt + 2 WHERE rgt > @myLeft;";         
            $sQuery3 = "UPDATE nestedpages SET lft = lft + 2 WHERE lft > @myLeft;";         
            $sQuery4 = "INSERT INTO nestedpages(nestedpage_name, lft, rgt) VALUES('".$sNewPageName."', @myLeft + 1, @myLeft + 2);";   
            $sQuery5 = "UNLOCK TABLES;";                                                            
                
            $oResult = $GLOBALS["oDB"]->query($sQuery1);
            $oResult = $GLOBALS["oDB"]->query($sQuery2);
            $oResult = $GLOBALS["oDB"]->query($sQuery3);
            $oResult = $GLOBALS["oDB"]->query($sQuery4);
            $oResult = $GLOBALS["oDB"]->query($sQuery5);


of is er nog een nettere manier?

Acties:
  • 0 Henk 'm!

  • ameesters
  • Registratie: Juni 2008
  • Laatst online: 05-01-2022
iets met pdo, transactions... ;)

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 06-06 20:38

krvabo

MATERIALISE!

Mysqli (note the i) heeft ook ondersteuning voor transactions en is waarschijnlijk makkelijker te gebruiken in zijn opzet (gok ik)

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Mysqli heeft gewoon een methode die noemt multi_query.

http://nl3.php.net/manual/en/mysqli.multi-query.php

Het lijkt me in elk geval al beter om mysqli te gebruiken ivm OO technieken en het feit dat er geen development meer gebeurt aan de mysql extension (enkel nog maintenance)
Of natuurlijk PDO.

[ Voor 3% gewijzigd door kluyze op 16-06-2011 22:32 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
krvabo schreef op donderdag 16 juni 2011 @ 22:21:
Mysqli (note the i) heeft ook ondersteuning voor transactions
Alle libraries hebben support voor transactions. Het verschil zit hem juist in de engines, zo heeft myisam geen support ervoor en innodb wel, maar innodb zou toch je default keuze moeten zijn (en is default vanaf 5.5).

En mysqli::multi_query is een epic slecht idee en hadden ze nooit moeten maken. Het biedt meer mogelijkheden bij een geslaagde sql injection, het verwerken van de queries is kut, het verwerken van errors is kut, de magische next_result() is kut. En je wint er helemaal niets mee.
Dit is zo subtiel mogelijk verwoord, gebruik het aub gewoon niet.

[ Voor 31% gewijzigd door Voutloos op 17-06-2011 08:42 ]

{signature}


Acties:
  • 0 Henk 'm!

Anoniem: 146875

LocoShady schreef op donderdag 16 juni 2011 @ 22:18:
[...]


Zucht, soms kan het zo voor de hand liggen. _O_
Er zit dus niks anders op dan het op deze manier te doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
            $sQuery0 = "LOCK TABLE nestedpages WRITE;";
            $sQuery1 = "SELECT @myLeft := lft FROM nestedpages WHERE nestedpage_name = '".$sParentName."';";            
            $sQuery2 = "UPDATE nestedpages SET rgt = rgt + 2 WHERE rgt > @myLeft;";         
            $sQuery3 = "UPDATE nestedpages SET lft = lft + 2 WHERE lft > @myLeft;";         
            $sQuery4 = "INSERT INTO nestedpages(nestedpage_name, lft, rgt) VALUES('".$sNewPageName."', @myLeft + 1, @myLeft + 2);";   
            $sQuery5 = "UNLOCK TABLES;";                                                            
                
            $oResult = $GLOBALS["oDB"]->query($sQuery1);
            $oResult = $GLOBALS["oDB"]->query($sQuery2);
            $oResult = $GLOBALS["oDB"]->query($sQuery3);
            $oResult = $GLOBALS["oDB"]->query($sQuery4);
            $oResult = $GLOBALS["oDB"]->query($sQuery5);


of is er nog een nettere manier?
toon volledige bericht
Dit is een perfecte candidaat voor een stored procedure. Het enige wat je daarna hoeft uit te voeren is 'call addNode($parentName, $newPageName)'. Als je begint met logica in de queries in te bouwen en het worden een paar regels aan queries, dan is een stored procedure makkelijker in gebruik en vaak iets efficienter.
Pagina: 1