[SQL] dynamische UPDATE in database

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 09-03 23:28
Ik heb een form waarin ik 40 nummers heb (een top 40). Het zijn alleen maar 40 cijfers die ik moet updaten. Die staan in het form aangegeven met

<INPUT TYPE="text" NAME="chartnl1">
<INPUT TYPE="text" NAME="chartnl2">
<INPUT TYPE="text" NAME="chartnl3">
etc. etc.

Daar vul je dan een nummer in. Nou heb ik dus bovenaan de pagina een query die moet aangeven dat al die dingen moet geupdate worden waar 'chart' in de table al die $chartnl1 en $chartnl2 etc zijn.
Hoe kan ik dat doen zonder een enorme query te maken.

De table ziet er as volgt uit:

chart | nr | song_id | datetime
---------------------------------------------
chartnl1 | 1 | 5468 | 2004-05-21 12:20:29
chartnl2 | 2 | 5642 | 2004-05-20 12:20:29
chartnl3 | 3 | 2134 | 2004-05-21 12:20:29
etc. etc.

En hij moet dus die nummers bij song_id invullen WHERE chart = die charts uit het form (1 tm 40)

Is dit mogelijk zonder het allemaal apart te doen?

Ik probeerde het zo van
<? $sql = 'UPDATE chartzz SET song_id = "' . $chart . '", datetime = NOW() WHERE chart = $chart'; ?>

Maarja, dat werkt natuurlijk niet. (Had ik ook wel verw8) Maar hoe moet ik het wel doen?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Als je nou <input name="chart[]"> gebruikt, dan kan het zo:
PHP:
1
2
foreach ($_POST["chart"] as $chart)
  $sql = 'UPDATE chartzz SET song_id = "' . $chart . '", datetime = NOW() WHERE chart = $chart';

Maar als je slim bent dan pas je je WHERE clause aan, zodat het een WHERE chart IN (.. , .. , ..) wordt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 09-03 23:28
Maar hoe zou ik dat WHERE chart IN (.. , .. , ..) moeten doen. Ik wil namenlijk niet vastleggen dat het 1 tot en met 40 is. Ik heb namenlijk ook nog andere charts die ook andere grootes kunnen hebben en wel met hetzelfde formpje geupdate moeten worden.

Kan ik niet in die WHERE iets zetten van WHERE chart = chartnl (1 +1) ofzoiets.
Dat hij dus zelf zet van chartnl en daar dan automatisch een 1 achter zet en daar elke keer 1 bij optelt net zolang totdat de UPDATE's op zijn.

Dit zou namenlijk de perfecte oplossing zijn :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Bij nader inzien kan zo'n WHERE constructie niet op die manier, omdat je de waarde $chart ook aan song_id geeft. Maar ik twijfel over je datamodel. Als song_id en chart allebei dezelfde waarde bevatten, wat heeft het dan voor nut om ze beide te hebben? :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 09-03 23:28
Ik zie ineens ook iets wat ik nog niet gezien had. Het zit dus zo dat er als ik dat form invul en op submit druk er 40 strings worden verstuurd. Die strings heten opvolgend chartnl1, chartnl2, chartnl3 etc. En ze bevatten nummers.

Wat ik dus wil is de table update'en door bij 40 rijen dat nummer in te voeren bij de kolom song_id waar de kolom genaamd 'chart' chartnl1, chartnl2 chartnl3 moet bevatten.
Ik moet dus ook de naam van die variabele gebruiken.

hoe zou dit kunnen?? Ik heb namenlijk echt geen idee??

[ Voor 27% gewijzigd door kramer65 op 26-05-2004 15:25 ]


  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 24-05 16:17
tja, ik blijf ook m'n twijfels houden over het datamodel, als je het zo op moet lossen...

maar goed, zo kan het volgens mij wel:

als je in je formulier nu opneemt, in een hidden veld, om wat voor chart het gaat (chartnl bv)

code:
1
2
3
4
5
<input type="hidden" name="chartID" value="chartnl">

<INPUT TYPE="text" NAME="chartval[1]">
<INPUT TYPE="text" NAME="chartval[2]">
<INPUT TYPE="text" NAME="chartval[3]">


en dan server side kan je wel zoiets doen (niet getest):

PHP:
1
2
3
4
5
foreach($_POST['chartval'] AS $intKey => $strValue)
{
   $strKey = $_POST['chartID'] . $intKey;
   mysql_query("UPDATE chartzz SET song_id = '" . $strValue . '", datetime = NOW() WHERE chart = '$strKey'");
}

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

PHP:
1
2
foreach (array_keys($_POST["chart"]) as $chart) 
  $sql = 'UPDATE chartzz SET song_id = "' . $_POST[$chart] . '", datetime = NOW() WHERE chart = $chart';

Maar ik blijf erbij dat dit geen optimale manier is. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 09-03 23:28
Ja dat heb ik nou geprobeerd.

foreach($_POST['chartval'] AS $intKey => $strValue)
{
$strKey = $_POST['chartID'] . $intKey;
$sql = 'UPDATE chartzz SET song_id = "' . $strValue . '", datetime = NOW() WHERE chart = $strKey';
mysql_query($sql);
}

Maar dat werkt dus niet. Ik krijg geen foutmeldingen, maar hij veranderd ook niets. Ik heb ernaar gekeken maar ik zou geen idee hebben wat er fout aan is. Nog meer ideeen? :) (Hopelijk wel, anders loop ik helemaal vast.... 8)7 )

[ Voor 27% gewijzigd door kramer65 op 26-05-2004 15:59 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Heb je die HTML wel goed overgenomen? Je moet die inputs dus ook wijzigen, zodat het een array wordt.

code:
1
2
3
4
5
6
7
<INPUT TYPE="text" NAME="chartval[1]">
<INPUT TYPE="text" NAME="chartval[2]">
<INPUT TYPE="text" NAME="chartval[3]">
...
<INPUT TYPE="text" NAME="chartval[38]">
<INPUT TYPE="text" NAME="chartval[39]">
<INPUT TYPE="text" NAME="chartval[40]">

Dat kan trouwens volgens mij ook gewoon zo:
code:
1
2
3
4
<INPUT TYPE="text" NAME="chartval[]">
<INPUT TYPE="text" NAME="chartval[]">
<INPUT TYPE="text" NAME="chartval[]">
enz...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 22:25
Uiteindelijk gaat het daar volgens mij allemaal niet om. Het belangrijkste wat de TS aangeeft is dat hij meerdere updates in 1 sql statement wil uitvoeren. En dat gaat mijns inziens niet lukken. Ik denk dus dat je toch met een loop zult moeten werken.

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 09-03 23:28
Ja, dat had iik ook veranderd. Ik heb het inmiddels ook nog zo geprobeerd:

<CODE>
$site = chartnl
for ($i = 1; $i <= 40; $i++) {
$sql = 'UPDATE chartzz SET song_id = "' . $$site[$i] . '", datetime = NOW() WHERE chart = "' . $site[$i] . '"';
$res = mysql_query($sql) or die("Update failed");
}
</CODE>

met in het form

<CODE>
<INPUT TYPE="text" NAME="chartnl1">
<INPUT TYPE="text" NAME="chartnl2">
<INPUT TYPE="text" NAME="chartnl3">
</CODE>

Maar dan krijg ik een update failed

Zou dit ook geen goede optie zijn?

(ps hoe krijg je zo;n code boxje?)

[ Voor 23% gewijzigd door kramer65 op 26-05-2004 16:20 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Cavalera schreef op 26 mei 2004 @ 16:13:
Uiteindelijk gaat het daar volgens mij allemaal niet om. Het belangrijkste wat de TS aangeeft is dat hij meerdere updates in 1 sql statement wil uitvoeren. En dat gaat mijns inziens niet lukken. Ik denk dus dat je toch met een loop zult moeten werken.
Meerdere updates in een gaat sowieso alleen lukken als dezelfde waarde wordt gebruikt in de SET, en zoals ik in mijn tweede post hier al zei, kan dat niet zomaar.

TS geeft trouwens gewoon aan die loops te proberen, dus ik denk dat hij inderdaad de HTML tags niet (goed) heeft overgenomen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 09-03 23:28
Okee het is gelukt!!!!

Ik had zelf een dom foutje gemaakt. Fantastisch echt. Dit was namenlijk zo'n beetje het laatste wat aan mijn site gedaan moest worden en iki werd er helemaal gek van. Maar hij werkt nu vrijwel helemaal!!

Dan ga ik weer even door met de laatste dingen. En binnenkort kan mijn site bezichtigd worden op ??????????? :*)

[ Voor 5% gewijzigd door kramer65 op 23-06-2008 12:49 ]


  • Scharnout
  • Registratie: November 2000
  • Laatst online: 18-04 19:02

Scharnout

Meuk

Pas je wel op voor SQL-Injection!

And Bob's your uncle ...


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

kramer65 schreef op 26 mei 2004 @ 16:42:
Okee het is gelukt!!!!

Ik had zelf een dom foutje gemaakt. Fantastisch echt. Dit was namenlijk zo'n beetje het laatste wat aan mijn site gedaan moest worden en iki werd er helemaal gek van. Maar hij werkt nu vrijwel helemaal!!

Dan ga ik weer even door met de laatste dingen. En binnenkort kan mijn site bezichtigd worden op www.lyriczz.com/index.php :*)
Misschien leuk voor de search als je erbij post hoe je het nou opgelost hebt. :)

Enneuh, code zet je tussen [code] tags, en php tussen [php] tags.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1