MySQL UPDATE SET $variabele werkt niet?
in mijn script heb ik wat code, en dan komen deze regels:
echo $fieldnamen;
mysql_query("UPDATE table1 SET $fieldnamen='$iValue' WHERE Naam='$sNaam'");
als ik de pagina open zie ik op de plaats dat ik $fieldnamen laat echoen een woord dat de naam van een kolom is. bijvoorbeeld: kolom3. Maar als ik bovenstaand script gebruik en ik kijk in de mysql table is er niks veranderd.
Als ik $fieldnamen in de query vervang door het woord kolom3 vult hij wel gewoon $iValue in in de table in kolom3!? Hoe kan ik ervoor zorgen dat $iValue in de kolom $fieldnamen komt??
alvast bedankt
nadat ik dat gedaan heb geeft hij geen errors ;/
- Bouw goede foutafhandeling in
- Variabelen buiten quotes
- Denk aan SQL injection
- $iValue en $sNaam ik denk dat je variabele aan het kopiëren bent, dit is fout en moet je niet doen
Wouter J op 01/03/2011 17:36:29:
(...)
- $iValue en $sNaam ik denk dat je variabele aan het kopiëren bent, dit is fout en moet je niet doen
- $iValue en $sNaam ik denk dat je variabele aan het kopiëren bent, dit is fout en moet je niet doen
Dat kan je niet zomaar stellen. Als de data gevalideerd is dan is het juist handig om wel te doen. Zoals die $iValue, dat duid er waarschijnlijk op dat er een integer in die variabele zit. Dat kan je mooi krijgen door gewoon te type casten.
Maar dat betekend dus wel dat die variabele niet tussen enkele quotes in de query mag.
Als ik fieldnamen zonder $ in zou vullen, dan zou php kijken in de table naar de kolom genaamd fieldnamen, en die kolom bestaat niet. PHP moet juist de string opgeslagen in $fieldnamen als kolomnaam gebruiken.
Karl, bedoelt u dat "type casten" de oplossing is voor dit probleem of ging u alleen op Wouter J. in?
Heb je ook fouthandeling in je script
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
37
38
39
40
41
42
43
44
45
46
47
48
49
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
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
if($_SERVER['REQUEST_METHOD'] == 'POST'){
/*connecten*/
mysql_connect("localhost", "*****", "*****") or die(mysql_error());
mysql_select_db("database1") or die(mysql_error());
foreach($_POST as $sWeapon => $iValue){
if(is_numeric($iValue)){
$query2 = mysql_query("SELECT * FROM table1 WHERE Naam='$sWeapon'");
$aCurrentPrices = mysql_fetch_array($query2, MYSQL_NUM);
$kolomnr = 1;
$nullcheck = false;
while($nullcheck == false){
$currentvalue = $aCurrentPrices[$kolomnr];
if(is_null($currentvalue)){
$nullcheck = true;
$query_output = mysql_query("SELECT * FROM table1 WHERE Naam='$sWeapon'");
for ($i = $kolomnr; $i < $kolomnr + 1; $i++) {
$fieldnamen = mysql_field_name($query_output, $i)."<br/>";
echo $fieldnamen;
echo $sWeapon;
echo $iValue;
mysql_query("UPDATE table1 SET $fieldnamen='$iValue' WHERE Naam='$sWeapon'");
}
}
else{
$kolomnr = $kolomnr + 1;
}
}
/*aantal updaten*/
$query = mysql_query("SELECT * FROM table1 WHERE Naam='$sWeapon'") or die(mysql_error());
$row = mysql_fetch_row($query) or die(mysql_error());
$aantalvoor = ($row[1]);
$aantalna = $aantalvoor + 1;
mysql_query("UPDATE table1 SET aantal='$aantalna' WHERE Naam='$sWeapon'") or die(mysql_error());
}
}
}
?>
ini_set('display_errors', 'On');
error_reporting(E_ALL);
if($_SERVER['REQUEST_METHOD'] == 'POST'){
/*connecten*/
mysql_connect("localhost", "*****", "*****") or die(mysql_error());
mysql_select_db("database1") or die(mysql_error());
foreach($_POST as $sWeapon => $iValue){
if(is_numeric($iValue)){
$query2 = mysql_query("SELECT * FROM table1 WHERE Naam='$sWeapon'");
$aCurrentPrices = mysql_fetch_array($query2, MYSQL_NUM);
$kolomnr = 1;
$nullcheck = false;
while($nullcheck == false){
$currentvalue = $aCurrentPrices[$kolomnr];
if(is_null($currentvalue)){
$nullcheck = true;
$query_output = mysql_query("SELECT * FROM table1 WHERE Naam='$sWeapon'");
for ($i = $kolomnr; $i < $kolomnr + 1; $i++) {
$fieldnamen = mysql_field_name($query_output, $i)."<br/>";
echo $fieldnamen;
echo $sWeapon;
echo $iValue;
mysql_query("UPDATE table1 SET $fieldnamen='$iValue' WHERE Naam='$sWeapon'");
}
}
else{
$kolomnr = $kolomnr + 1;
}
}
/*aantal updaten*/
$query = mysql_query("SELECT * FROM table1 WHERE Naam='$sWeapon'") or die(mysql_error());
$row = mysql_fetch_row($query) or die(mysql_error());
$aantalvoor = ($row[1]);
$aantalna = $aantalvoor + 1;
mysql_query("UPDATE table1 SET aantal='$aantalna' WHERE Naam='$sWeapon'") or die(mysql_error());
}
}
}
?>
mysql_real_escape_string
- variabelen buiten de quotes houden
- Bouw fouthandeling in Geen or die
- gebruik mysql_fetch_assoc ipv array
- gebruik geen * dit is een wildcard , Selecteer war je wilt
- Letop mysql injection (- variabelen buiten de quotes houden
- Bouw fouthandeling in Geen or die
- gebruik mysql_fetch_assoc ipv array
- gebruik geen * dit is een wildcard , Selecteer war je wilt
misschien beetje offtopic maar als je alles uit je tabel nodig hebt mag je dan nog geen * gebruiken?
Gewijzigd op 01/03/2011 18:30:05 door Jasper DS
T voskuil op 01/03/2011 17:52:04:
Karl, bedoelt u dat "type casten" de oplossing is voor dit probleem of ging u alleen op Wouter J. in?
Ik ging op Wouter in dat zijn laatste stelling niet zo stellig gesteld kan worden.
PHP Jasper op 01/03/2011 18:29:20:
neen, geen idee waarom maar het heeft iets met de snelheid te maken denk ik. (en ook met "netjes scripten" bij sql schrijf je wat je doet.
Natuurlijk alles mag, maar het is niet handig. Het mooie aan SQL is dat het self documenting is. Verder is * een wildcard, wat wilt zeggen dat de database engine in principe zelfs nul velden mag teruggeven. En zoals Jasper al opmerkt, het gaat om snelheid, de database hoeft niet op te zoeken welke velden er opgehaald worden. En er hoeft minder verwerkt te worden als niet alles opgehaald hoeft te worden.
heeft iemand nu al een idee hoe je de string van $fieldnamen in de query kan weergeven????
- De foreach is niet logisch. Bovendien kan de submit knop en andere waarden soms mee worden gestuurd.
- Gebruik duidelijke namen. $query2 is geen duidelijke naam. table1 ook niet.
- Selecteer wat je wilt hebben, gebruik geen *.
- Foutafhandeling ontbreekt.
- Waarvoor dient die nullcheck?
- Waarvoor dient $query_output gedeelte tot de eerstvolgende mysql_query?
- Waarvoor dient het laatste gedeelte?
Karl ik snap dat de code niet geweldig is maar ik moet eerst even weten hoe ik $fieldnamen in de query kan opnemen voordat ik de code verder ga verbeteren.
In de database kijken hoe ze heten.
wat nou als de string in $fieldnamen elke keer dat er gepost wordt verandert.... dus de kolom verandert...