mysql en update+1
Code (php)
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
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);
}
}
}
}
?>
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
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.
$sql = "SELECT DISTINCT *
doet het ook nog!
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?
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 * ??
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 ;-)
Ja, ik begrijp alleen nu even niet of je bedoelt dat daar de fout zit of bedoel je dat daar niet de fout inzit?
Het blijkt geen fout statement te zijn, maar een onzinnig statement. Met SELECT DISTINCT * krijg je altijd alle records.
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.
niemand?
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.
Welke foutmelding krijg je?
Domme vraag, maar wat is de foutmelding?
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
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 -
dit deed ik, misschien te oude mysql versie?
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.
waarom is het dan kansloos?
femke schreef op 29.01.2007 18:34:
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 heb MySQL 4.0.27 en ik ben nu eenmaal afhankelijk van wat mijn hoster aanbiedt ..
waarom is het dan kansloos?
waarom is het dan kansloos?
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.