Toon posts:

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

Pagina: 1
Acties:

Onderwerpen


  • LocoShady
  • Registratie: Mei 2003
  • Laatst online: 19-05 18:22
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)

  • DR
  • Registratie: December 2000
  • Niet online
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

  • LocoShady
  • Registratie: Mei 2003
  • Laatst online: 19-05 18:22
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?

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

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 26-05 22:43

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.


  • 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]


  • 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}


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?
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


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee