Door
Theo Huitema
op 13-12-2018 14:44
gewijzigd op 13-12-2018 18:46
2.191 views
Meestal doe ik een update van één record, maar nu wil ik één veld (als die leeg is) updaten voor alle records.
Hieronder de code. Maar deze stopt na 1 record.
Mogelijk heeft dat te maken met '%%", maar weet even niet hoe dit moet en zag via google ook niet echt iets.
Weet een van jullie dit?
<?php
// Verbind met database
try
{
$pdoResult = $pdoConnect->prepare("SELECT * FROM db_bidprentjes WHERE id LIKE :id ");
$pdoResult->bindValue(':id', '%%');
$pdoResult->execute(array(':id' => '%%' ));
while($row = $pdoResult->fetch(PDO::FETCH_ASSOC)) {
$Gid = $row['id'] ;
$Ged = $row['gedcomnummer'] ;
if ($Ged =='') {$Ged =='0';}
$update_query = "UPDATE db_bidprentjes SET gedcomnummer='$Ged' WHERE id=:id";
$pdoResult= $pdoConnect->prepare($update_query);
Echo " - ".$Gid." ".$Ged." <br>";
} // while
} // einde try
catch(PDOException $e){
echo $e->getMessage(); }
?>
Ik wil eigenlijk een loop maken en controleren of de variabele al een waarde heeft, zo niet, dan vullen met een waarde nul.
De controle op een waarde doe ik met -> if ($Ged =='') {$Ged =='0';}
Maar hoe maak ik zo'n loop dat de while statement alle records doorloopt?
UPDATE db_bidprentjes SET gedcomnummer=[color=#ff0000]'$Ged'[/color] WHERE id=:id
Is ook niet het idee van prepared statements...
Daarbij, je prepare-d de UPDATE-query weliswaar, maar je kent nergens een waarde toe aan de :id in die query, noch voer je de query uit met een execute. Of was dit eerst om te testen of dit werkt voordat je de update daadwerkelijk ging uitvoeren?
Overigens is dit:
WHERE id LIKE :id
nogal onzinnig. Bij id's zou je niet te hoeven "raden", een id is er juist voor dat je een record direct -op een deterministische manier- kunt aanwijzen.
Een veel betere WHERE-conditie is die van @Adoptive:
Adoptive Solution op 13/12/2018 15:48:10
Zoek naar alle record waar gedcomnummer leeg is ipv id = %%
Want dat zijn de records die je wilt updaten.
EDIT: Sterker nog, zou je dit niet met één query kunnen doen, zonder loop?
UPDATE <tabel> SET <te_wijzigen_kolom> = <gewenste_waarde> WHERE <te_wijzigen_kolom> = <ongewenste_waarde>
<?php
// Verbind met database
$Zged='';
try
{
$pdoResult = $pdoConnect->prepare("SELECT * FROM db_bidprentjes WHERE gedcomnummer LIKE :gedcomnummer");
$pdoResult->bindValue(':gedcomnummer', $Zged);
$pdoResult->execute(array(':gedcomnummer' => $Zged ));
while($row = $pdoResult->fetch(PDO::FETCH_ASSOC)) {
$Gid = $row['id'] ;
$Ged = '0';
$update_query = "UPDATE db_bidprentjes SET gedcomnummer=$Ged WHERE id=:id ";
$pdoResult= $pdoConnect->prepare($update_query);
Echo " - ".$Gid." - ".$Ged." <br>";
} // while
} // einde try
catch(PDOException $e){
echo $e->getMessage(); }
?>
De echo geeft : - 352 - 0
Dus eerste lege record is nr 352, de waarde Ged$ is nul.
Maar het veld wordt niet bijgewerkt, in phpmyadmin blijft veld (varchar(15)) leeg.
Ook stopt het bij record 352, de overige records loopt hij niet door.
Je zou zelfs rechtstreeks een query kunnen uitvoeren met PDO::query(), een prepare() is niet nodig.
En als je er over nadenkt is dit een eenmalige wijziging, dus een rechtstreekse query in phpMyAdmin of een mysql shell zou veel logischer zijn, hier hoeft verder geen letter (PHP-)code voor aan te pas te komen, het is namelijk geen complexe conversie ofzo, maar een eenmalige omzetting.