mysql en update+1

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Femke

femke

26/01/2007 11:52:00
Quote Anchor link
Om het aantal met 1 op te hogen gebruik ik de volgende query echter soms hoogt hij met meer dan 1 op, werkt deze update query niet 100% binen mysql?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

function saveWoord($array) {

        //de keywords een voor een wegschrijven in de database
        foreach ($array as $woord) {

            $sql = "SELECT DISTINCT * FROM Test WHERE Woord='$woord'";
            $records = mysql_query($sql);

            if (preg_match ("/^[a-z]{2,}/i",$woord))  {

                //als keyword nog niet voorkomt
                if (mysql_num_rows($records) < 1) {

                    $query = "INSERT INTO Test (Woord) VALUES ('$woord')";

                    

                    $resultaat = mysql_query($query);
                }

                
                //keyword aantal updaten
                else {
                    $query = "UPDATE Test SET Frequency = (Frequency + 1) WHERE Woord='$woord'";
                    $resultaat = mysql_query($query);
                    unset($query);
                }
            }
       }

        
    
}


?>
Gewijzigd op 01/01/1970 01:00:00 door Femke
 
PHP hulp

PHP hulp

19/11/2024 21:48:10
 
Joren de Wit

Joren de Wit

26/01/2007 18:39:00
Quote Anchor link
Hoe bedoel je hij hoogt met meer dan 1 op?

Daarnaast mis ik de foutafhandeling bij je sql queries in je code. Je controleert nergens of deze queries wel gelukt zijn.

Ook denk ik dat je datamodel van je database niet helemaal klopt, aangezien je normaal gesproken bijna nooit een resultaat van een berekening opslaat in je database. De kolom 'Frequency' is eigenlijk het resultaat van een berekening, namelijk van een bepaald aantal woorden.
 
Jan Koehoorn

Jan Koehoorn

26/01/2007 18:43:00
Quote Anchor link
Ik heb net even getest, en dit statement:

$sql = "SELECT DISTINCT *

doet het ook nog!
 
Joren de Wit

Joren de Wit

26/01/2007 18:45:00
Quote Anchor link
Daar zat ik ook al aan te twijfelen, maar blijkbaar werkt het dus. Er worden dan alleen maar unieke records opgehaald? Dus waarbij alle combinaties van velden uniek moeten zijn?
 
Femke

femke

26/01/2007 19:51:00
Quote Anchor link
foutafhandeling heb ik even weggelaten voor de overzichtelijkheid.

Datamodel kan niet anders, ik werk namelijk met externe data en het enige dat mij interesseert is het aantal maal dat woord X voorkomt, vandaar dat het zo opgeslagen wordt.

"Ik heb net even getest, en dit statement:

$sql = "SELECT DISTINCT *

doet het ook nog!"

wat is er mis met SELECT DISTINCT * ??
 
Jan Koehoorn

Jan Koehoorn

26/01/2007 20:16:00
Quote Anchor link
Blanche schreef op 26.01.2007 18:45:
Daar zat ik ook al aan te twijfelen, maar blijkbaar werkt het dus. Er worden dan alleen maar unieke records opgehaald? Dus waarbij alle combinaties van velden uniek moeten zijn?

Ik heb die query net even in een testtabel met 300.000 records uitgevoerd, en dan pakt hij gewoon alle records. Lijkt me ook wel logisch, want je auto-increment veld is voor elke record uniek ;-)
 
Femke

femke

26/01/2007 20:40:00
Quote Anchor link
Ja, ik begrijp alleen nu even niet of je bedoelt dat daar de fout zit of bedoel je dat daar niet de fout inzit?
 
Jan Koehoorn

Jan Koehoorn

26/01/2007 20:57:00
Quote Anchor link
Het blijkt geen fout statement te zijn, maar een onzinnig statement. Met SELECT DISTINCT * krijg je altijd alle records.
 
Femke

femke

28/01/2007 17:04:00
Quote Anchor link
ik begrijp niet geheel waardoor de update zo instabiel kan zijn, de ene keer update hij met 1 en de andere keer met bv 3. Waar kan dit door komen?

Kan het zijn door de foreach loop? Dat als hij bv 3 woorden in de array heeft staan, dat hij op de een of andere manier 3x gaat updaten in de foreach loop? Lijkt me toch niet.

Kan het zijn dat ik de database connectie niet goed sluit en dat de +1 in het geheugen blijft staan en daardoor soms het 3 uitvoert ??

Ik begrijp niet geheel waar de instabiliteit vandaan komt, de functie wordt namelijk maar 1x aangeroepen.
 
Femke

femke

29/01/2007 13:21:00
Quote Anchor link
niemand?
 
Frank -

Frank -

29/01/2007 13:38:00
Quote Anchor link
Je gebruikt 3 queries, SELECT/INSERT/UPDATE, en dat terwijl je deze vrij eenvoudig kunt vervangen door slechts 1 query:
INSERT ... ON DUPLICATE KEY UPDATE

Maak de kolom 'woord' UNIQUE en je kunt veilig deze enkele query uitvoeren.

Zie de handleiding voor de volledige omschrijving en toepassing.

Tip: Foutafhandeling! De aanname dat iedere query goed gaat, is de grootste fout die je kunt maken. Controleer dus ook óf er wel iets is weggeschreven of geupdate, mysql_affected_rows() doet wonderen.
 
Femke

femke

29/01/2007 13:59:00
Quote Anchor link
de volgende query werkt niet wat, wat gaat er fout?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

$query
= "INSERT INTO Test (Keyword,Frequency) VALUES ('$keyword','1') ON DUPLICATE KEY UPDATE Frequency=Frequency+1";

?>
 
Joren de Wit

Joren de Wit

29/01/2007 14:00:00
Quote Anchor link
Welke foutmelding krijg je?
 
Frank -

Frank -

29/01/2007 14:01:00
Quote Anchor link
Domme vraag, maar wat is de foutmelding?
 
Femke

femke

29/01/2007 14:04:00
Quote Anchor link
Fout

SQL-query :

INSERT INTO test (Keyword) VALUES ('hallo') ON DUPLICATE KEY UPDATE Frequency=Frequency+1

MySQL retourneerde:

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 'ON DUPLICATE KEY UPDATE Frequency=Frequency+1' at line 1
 
Frank -

Frank -

29/01/2007 14:13:00
Quote Anchor link
--- delete ---

Edit: De genoemde query werkt hier uitstekend, geen idee wat er dan bij jou fout gaat. Probeer de query eens in PHPMyAdmin uit te voeren, dan krijg je misschien wat meer duidelijkheid over wat er nu precies gebeurd. (mocht je dit nog niet doen)
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Femke

femke

29/01/2007 17:04:00
Quote Anchor link
dit deed ik, misschien te oude mysql versie?
 
Frank -

Frank -

29/01/2007 17:12:00
Quote Anchor link
Tja, dat zou kunnen, maar in dat geval ben je bezig met een kansloos script (persoonlijke mening...). Versie 4.1 is de minimale vereiste voor deze INSERT-query.

Wanneer jij niet beschikt over minimaal versie 4.1, mag je jezelf serieus afvragen waar je mee bezig bent. Pas vanaf versie 5 begint MySQL op een echte database (dbms) te lijken, versie 4.1 was nog erg brak, nog oudere versies zijn nauwelijks beter dan een flat-file systeem. Zie http://www.yapf.net/Articles/ArticleView/803 voor een overzichtje van problemen met MySQL.

Oplossing: Upgraden naar een betere versie of stap direct over op PostgreSQL, net zo eenvoudig in het gebruik, maar vele malen beter.
 
Femke

femke

29/01/2007 18:34:00
Quote Anchor link
ik heb MySQL 4.0.27 en ik ben nu eenmaal afhankelijk van wat mijn hoster aanbiedt ..

waarom is het dan kansloos?
 
Frank -

Frank -

29/01/2007 18:49:00
Quote Anchor link
femke schreef op 29.01.2007 18:34:
ik heb MySQL 4.0.27 en ik ben nu eenmaal afhankelijk van wat mijn hoster aanbiedt ..

waarom is het dan kansloos?
Dat is echt onzin! Je kunt in de eerste plaats vragen of hij een betere versie kan installeren en in de tweede plaats kun je zonder noemenswaardige problemen overstappen naar een hostingprovider die zijn klanten wél serieus neemt en een goede dbms aanbiedt.

Ik noem het kansloos omdat je een database gebruikt die niet veilig met jouw data omgaat. MySQL doet niet/of nauwelijks wat om problemen met de data te voorkomen, laat staan dat MySQL 4.0 nauwelijks gereedschappen heeft om jou het SQL-leven een stuk eenvoudiger te maken. De kans dat jij met inconsistente data komt te zitten is groot. En dat terwijl dat helemaal niet nodig is en dit geen rooie cent extra hoeft te kosten. Integendeel, omdat MySQL een half product levert, kun jij nu in PHP het werk van de database gaan zitten programmeren.

Kortom, gebruik een betere database en je bespaart jezelf een hele hoop werk. Tevens krijg je meer zekerheid over de veiligheid van de data. Gebruik dus MySQL versie 5 (strict!!!) of nog beter PostgreSQL.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.