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();  }  
		
?>
Waarom eerst de records met een leeg veld zoeken als je direct die regels kunt aanpassen .

Regel 14 uitvoeren is dan voldoende.

update db_bidprentjes set gedcomnummer=0 where gedcomnummer = ''


Dit soort dingen kan je oefenen in phpMyAdmin of gelijke client.

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?
Zoek naar alle record waar gedcomnummer leeg is ipv id = %%

En aangenomen dat id een indexnummer is kan je het record daarmee terugvinden.
En dit:
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>

of
WHERE <te_wijzigen_kolom> != <gewenste_waarde>

ofzo?
De code aangepast naar..

<?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.

id is inderdaad primaire sleutel en index.

Ik probeer jullie adviezen op te volgen, maar zie nog niet waarom het niet lukt.
De update doet het niet.


<?php  
$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)) {

		$update_query = "UPDATE db_bidprentjes SET gedcomnummer='0' WHERE gedcomnummer='' ";
		$pdoResult= $pdoConnect->prepare($update_query);


    } // while
	} // einde try
        catch(PDOException $e){
        echo $e->getMessage();  }  		
?>
Zou dit de oplossing zijn ?

$update_query = "UPDATE db_bidprentjes SET gedcomnummer='0' WHERE gedcomnummer='' ";
$pdoResult = $pdoConnect->prepare($update_query);
$pdoResult->execute();


Handleiding waaruit de inspiratie komt :

https://www.w3schools.com/php/php_mysql_update.asp

$sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2";
// Prepare statement
$stmt = $conn->prepare($sql);
// execute the query
$stmt->execute();

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.
Had ik ook al geprobeerd Thomas. Het lukte wel in phpadmin om een veld met waarde wijzigen, maar niet om een veld met NULL.

Reageren