ON DUPLICATE KEY UPDATE probleem
ik zou willen dat indien iemand een film wil toevoegen via een imdb url de query bekijkt of de film al in de database zit door de kolom imdb te vergelijken met de nieuwe link van de film ".$url." en indien de film bestaat de date in de database te updaten.
ik had zitten denken aan deze code:
Code (php)
1
2
3
4
2
3
4
<? php
mysql_query("INSERT INTO movies (name, rating, year, runtime, imdb)
VALUES ('".$movie->title()."', '".$movie->rating()."', '".$movie->year()."', '".$movie->runtime()."', '".$url."') ON DUPLICATE KEY UPDATE name=VALUES('".$movie->title()."'), rating=VALUES('".$movie->rating()."'), year=VALUES('".$movie->year()."'), runtime=VALUES('".$movie->runtime()."'), imbd = VALUES('".$url."'");
?>
mysql_query("INSERT INTO movies (name, rating, year, runtime, imdb)
VALUES ('".$movie->title()."', '".$movie->rating()."', '".$movie->year()."', '".$movie->runtime()."', '".$url."') ON DUPLICATE KEY UPDATE name=VALUES('".$movie->title()."'), rating=VALUES('".$movie->rating()."'), year=VALUES('".$movie->year()."'), runtime=VALUES('".$movie->runtime()."'), imbd = VALUES('".$url."'");
?>
maar blijkbaar werkt het niet op de 1 of andere manier ziet er iemand een fout?
de fout is: Call to undefined function msql_query().
de tabel werkt ook met een auto increment van de kolom id
alvast bedankt
Gewijzigd op 15/01/2011 18:24:36 door Kevin vdm
PDO. Daar ben je snel mee weg.
Als je mysql gebruikt, zou ik eens proberen de mysql_* functies aan te roepen, in plaats van de msql_* functies ;) Voor PostgreSQL is het pgsql_* en voor MS SQL-server is het mssql_*. Je kan ook best een kijken voor Schrijf je queries overzichtelijk uit en voer deze niet direct aan een _query functie met ken het toe aan een variabele, zodat je een combinatie kunt maken error + statement
Les 2:
Leer eens fouten intrepeteren, moge duidelijk zijn dat je een typo gemaakt hebt
je bedoelt waarschijnlijk
mysql_query of mssql_query
Les 3:
Raadpleeg dan ook eerst je handleiding wat betreft de syntaxt
wel, het probleem is dus dat hij als de film niet bestaat er ook geen nieuwe data insteekt.
Toevoeging op 15/01/2011 18:34:47:
ok, ik heb er dit van gemaakt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? php
$sqlm = "INSERT INTO movies (name, rating, year, runtime, imdb)
VALUES ('".$movie->title()."', '".$movie->rating()."', '".$movie->year()."', '".$movie->runtime()."', '".$url."')
ON DUPLICATE KEY UPDATE name=VALUES('".$movie->title()."'), rating=VALUES('".$movie->rating()."'), year=VALUES('".$movie->year()."'), runtime=VALUES('".$movie->runtime()."'), imbd = VALUES('".$url."')";
if(($result = mysql_query($sqlm)) === false)
{
echo mysql_error();
}
else
{
$auto = mysql_query($sqlm);
}
?>
$sqlm = "INSERT INTO movies (name, rating, year, runtime, imdb)
VALUES ('".$movie->title()."', '".$movie->rating()."', '".$movie->year()."', '".$movie->runtime()."', '".$url."')
ON DUPLICATE KEY UPDATE name=VALUES('".$movie->title()."'), rating=VALUES('".$movie->rating()."'), year=VALUES('".$movie->year()."'), runtime=VALUES('".$movie->runtime()."'), imbd = VALUES('".$url."')";
if(($result = mysql_query($sqlm)) === false)
{
echo mysql_error();
}
else
{
$auto = mysql_query($sqlm);
}
?>
de error is:
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 ''Vampires Suck'), rating=VALUES('3.3'), year=VALUES('2010'), imbd = VALUES('http' at ...
Gewijzigd op 15/01/2011 18:38:27 door kevin vdm
Here is an example of how to update multiple columns using values supplied in the INSERT statement. This assumes that column 'a' is the unique key.
INSERT INTO table (a,b,c,d,e) VALUES (1,2,3,4,5) ON DUPLICATE KEY UPDATE b=VALUES(b), c=VALUES(c), d=VALUES(d), e=VALUES(e);
This also works for multiple rows:
INSERT INTO table (a,b,c,d,e) VALUES (1,2,3,4,5), (6,7,8,9,10) ON DUPLICATE KEY UPDATE b=VALUES(b), c=VALUES(c), d=VALUES(d), e=VALUES(e);
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
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
<? php
$sqlm = "INSERT INTO movies
( name
, rating
, year
, runtime
, imdb
)
VALUES ( '".$movie->title()."'
, '".$movie->rating()."'
, '".$movie->year()."'
, '".$movie->runtime()."', '".$url."'
)
ON DUPLICATE KEY
UPDATE id=LAST_INSERT_ID(id)
, name=VALUES(name)
, rating=VALUES(rating)
, year=VALUES(year)
, runtime=VALUES(runtime)";
if(($result = mysql_query($sqlm)) === false)
{
echo mysql_error();
}
else
{
$auto = mysql_query($sqlm);
}
?>
$sqlm = "INSERT INTO movies
( name
, rating
, year
, runtime
, imdb
)
VALUES ( '".$movie->title()."'
, '".$movie->rating()."'
, '".$movie->year()."'
, '".$movie->runtime()."', '".$url."'
)
ON DUPLICATE KEY
UPDATE id=LAST_INSERT_ID(id)
, name=VALUES(name)
, rating=VALUES(rating)
, year=VALUES(year)
, runtime=VALUES(runtime)";
if(($result = mysql_query($sqlm)) === false)
{
echo mysql_error();
}
else
{
$auto = mysql_query($sqlm);
}
?>
nu kijkt hij niet voor duplicates en voegt hij de row 2 keer toe, dit is men tabel:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE IF NOT EXISTS `movies` (
`id` int(10) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`imdb` varchar(80) NOT NULL,
`year` int(5) NOT NULL,
`poster` varchar(255) NOT NULL default 'imdbnotavailable.png',
`runtime` int(4) NOT NULL,
`budget` varchar(255) NOT NULL,
`revenue` varchar(255) NOT NULL,
`rating` decimal(10,1) NOT NULL,
`cat1` varchar(20) NOT NULL,
`cat2` varchar(20) NOT NULL,
`cat3` varchar(20) NOT NULL,
`cat4` varchar(20) NOT NULL,
`cat5` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=25 ;
`id` int(10) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`imdb` varchar(80) NOT NULL,
`year` int(5) NOT NULL,
`poster` varchar(255) NOT NULL default 'imdbnotavailable.png',
`runtime` int(4) NOT NULL,
`budget` varchar(255) NOT NULL,
`revenue` varchar(255) NOT NULL,
`rating` decimal(10,1) NOT NULL,
`cat1` varchar(20) NOT NULL,
`cat2` varchar(20) NOT NULL,
`cat3` varchar(20) NOT NULL,
`cat4` varchar(20) NOT NULL,
`cat5` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=25 ;
en nu heb ik geen idee meer...
Gewijzigd op 15/01/2011 19:15:59 door kevin vdm
Laat VALUES weg en zorg er gewoon voor de x met y matched
beetje verder door normaliseren kan ook geen kwaad
http://www.yapf.net/index.php/Database_ontwerp_101
En ik ga me toch afvragen of het je gaat lukken. Een ON DUPLICATE gaat af op de pimary key
Andere optie is een constraint te zetten en als je daar dan tegen aanloopt het record updaten
dus eerst kijken of de record bestaat door te kijken naar de imdb link als ze bestaat dan updaten anders toevoegen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
if(mysql_num_rows(mysql_query("SELECT * FROM movies WHERE imdb='".$url."'"))){
$auto = mysql_query("update movies WHERE imdb='".$url."' SET name='".$movie->title()."', rating='".$movie->rating()."', year='".$movie->year()."', runtime='".$movie->runtime()."'");
}
else
{
$auto = mysql_query("INSERT INTO movies (name, rating, year, runtime, imdb)
VALUES ('".$movie->title()."', '".$movie->rating()."', '".$movie->year()."', '".$movie->runtime()."', '".$url."')");
}
?>
if(mysql_num_rows(mysql_query("SELECT * FROM movies WHERE imdb='".$url."'"))){
$auto = mysql_query("update movies WHERE imdb='".$url."' SET name='".$movie->title()."', rating='".$movie->rating()."', year='".$movie->year()."', runtime='".$movie->runtime()."'");
}
else
{
$auto = mysql_query("INSERT INTO movies (name, rating, year, runtime, imdb)
VALUES ('".$movie->title()."', '".$movie->rating()."', '".$movie->year()."', '".$movie->runtime()."', '".$url."')");
}
?>