[PHP/MySQL] Multi statements in één query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil query's zoals deze kunnen uit voeren:

code:
1
2
3
4
5
6
$query = "
SET @int := 0;
UPDATE `listItem` SET `order` = (SELECT @int:=@int+1) WHERE `listID` = '1' ORDER BY `order` ASC;
"

$result  = mysql_db_query($sql_db, $query);


Maar dan krijg ik:
code:
1
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 '; UPDATE `art_productListItem` SET `order` = (SELECT @int:=@int+1) WHERE `produc' at line 1


Ik draai:
- Fedora Core 7
- PHP 5.2.4
- Apache/2.2.6
- Server MySQL 5.0.45-community
- Client MySQL 5.0.45

Ik maak connectie met:
code:
1
$db     = mysql_connect('localhost','user','password', false, CLIENT_MULTI_STATEMENTS );


Zodra ik de query draai in phpMyAdmin(2.11.1) werkt hij prima.

php.ini:
code:
1
sql.safe_mode = Off


Heb lopen zoeken(+5 uur ;( ) naar mensen met het zelfde probleem maar op zowiezo op google/GoT kom ik
geen resultaten tegen met een oplossing (laat staan mensen die het zelfde probleem hebben).


Mocht iemand weten hoe ik bovenstaande query kan uitvoeren in php of
van de 2 statements 1 query maak?


ff wat info over de tabel:
(echte tabel is 'groter')

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE IF NOT EXISTS `listItem` (
  `listItemID` int(10) NOT NULL auto_increment,
  `lListID` int(10) default NULL,
  `amount` float default NULL,
  `unit` mediumint(5) default NULL,
  `order` smallint(5) default NULL,
  PRIMARY KEY  (`listItemID`),
  KEY `productListID` (`listID`),
  KEY `order` (`order`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=24 ;

--
-- Gegevens worden uitgevoerd voor tabel `art_productListItem`
--

INSERT INTO `listItem` (`listItemID`, `listID`, `amount`, `unit`, `order`) VALUES
(1,  1, 2, NULL, 3),
(2,  1, 1, NULL, 4),
(3,  1, 5, NULL, 1),
(4,  1, 3, NULL, 2),
(22, 1, 2, NULL, 6),
(23, 1, 5, NULL, 5);


col `order` wordt gebruikt om de volgorde te wijzigen bij de weergaven van de listItem's
Bij het verwijderen van 1 of medere regels moeten de gaten 'gevuld' worden,
dus nieuwe waardes in de order col gestopt worden maar wel in de originele volgorde.

ow en de server is alleen intern bereikbaar en draait geen andere sites

Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

Spontane ingeving :

SQL:
1
2
SET @int :=0;
UPDATE listItem AS a JOIN (SELECT @int := @int +1 AS inc) AS b SET a.order = b.inc WHERE a.listID =1


Werkt Niet :'( Sorry...

[ Voor 7% gewijzigd door glashio op 26-02-2008 09:51 ]

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Waarschijnlijk is phpMyAdmin zo snugger om ingevoerde tekst op ';' te scheiden, de individuele delen als queries te beschouwen en die los uit te voeren. Als je meerdere statements ineens uitgevoerd wil hebben, kan je ze in een stored procedure stoppen, of je moet zorgen dat je een specifieke connectie vasthoudt, zodat je op die connectie een transactie kan beginnen, meerdere statements kan uitvoeren en de transactie kan committen.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

Nieuwe poging :

SQL:
1
2
3
4
5
6
7
8
9
10
11
SET @int=0;
UPDATE
    listItem a
JOIN
    (SELECT @int:=@int+1 as inc, listID, listItemID FROM listItem WHERE listID = 1) AS c
SET
    a.order=c.inc
WHERE
    a.listID=c.listID
AND
    a.listItemID=c.listItemID
Werkt stiekem wel
User variabelen blijven staan totdat de client-connectie verbroken wordt. Dus als je persistent connecties gebruikt dan heb je kans dat je waardes meekrijgt van een vorige sessie. Maargoed omdat je telkens de variable opnieuw op 0 zet is dat dus ook niet het geval :) En inderdaad (phpMyAdmin doet dit automatisch) het zijn 2 queries die je afzonderlijk naar de server moet sturen.

edit :

En als je alle listID's in 1 keer opnieuw wil sorteren/reorganiseren kan je ook dit doen :

SQL:
1
2
3
4
5
6
7
8
9
SET @int=0, @id=0;
UPDATE
    listItem a
JOIN
    (SELECT @int:=CASE WHEN @id <> listID THEN 0 ELSE @int+1 END as inc, @id:=listID, listItemID FROM listItem ORDER BY listID, `order`) AS c
SET
    a.order=c.inc
WHERE
    a.listItemID=c.listItemID

[ Voor 21% gewijzigd door glashio op 26-02-2008 11:15 ]

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
eh super bedankt voor het uitzoeken.

heb nu gebruikt gemaakt van

mysql_pconnect();

en voer nu twee aparte query's uit.

Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024

CRiMiNaL

Witlof ^^

Ik raad je aan DIT even goed door te lezen voordat je van persistent connections gebruik gaat maken, want vooral in een live omgeving kan je al snel tegen een connectie limiet aanlopen op je mysql server.

Misschien is de oplossing van ChessSpider daarom geschikter.

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah dat zocht ik eigenlijk :)

Denk overigens dat ik voor mijn toepassing geen problemen zal krijgen met persistent connections
maar die mysqli_multi_query() lijkt mij wel een betere oplossing.

Bedankt everybody 8)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je kan natuurlijk ook gewoon twee queries los uitvoeren via mysql_query ... het is niet alsof het dan anders werkt dan mysqli_multi_query, phpmyadmin of de cli ;)

Maar MySQL ondersteund zelf vooralsnog geen meerdere queries per packet.
Pagina: 1