14 berichten aan het bekijken - 1 tot 14 (van in totaal 14)
  • Q:
    Bijdrager
    verwijderd-profiel

    Wijzigen record PHP/PDO/MySQL werkt niet

    Hallo,

    Ik heb een database “Telefoon” met de tabel “Telefoonnummers”.
    De tabel heeft de volgende kolommen: “naam”, “telefoonnummer” en “mobiel”. (naam is de primary key)

    Ik heb nu in PHP dmv PDO een pagina gemaakt die kan zoeken (zoeken.php). Wanneer je een naam invult krijg je het telefoonnummer en mobiele nummer terug.

    Ook heb ik een pagina admin.php, daar staat de hele database. Daar kan je klikken op Wijzig of Verwijder, of een record toevoegen. Het toevoegen werkt, het verwijderen moet ik nog maken, maar het wijzigen lukt niet.

    Als ik op wijzig klik ga ik naar wijzig_telefoonnummer.php, daar kan je de nieuwe gegevens invullen, en als je daar op Wijzig klikt moet de pagina wijzig.php dat uitvoeren. Maar het probleem is dat er helemaal niks in de database wordt verandert.

    Hopelijk is hier iemand die ziet wat ik fout doe.

    Hier de files.

    Zoeken.php

     
    <!DOCTYPE HTML>
    <html>
     
    	<head>
    		<title>Zoek nummer</title>
    	</head>
     
    	<body>
     
    		<?php
     
    			//databaseverbinding maken
    			$user = "root";
    			$pass = "root";
     
    			$dbh = new PDO (
    				'mysql:host=localhost; port=8473; dbname=telefoon',
    				$user,
    				$pass
    			);
     
    			$name = $_GET["naam"]; //$name krijgt waarde van naam
    			$number = NULL; //$number is hier leeg
    			$mobile = NULL; //$mobile is hier leeg
     
    			//SQL script
    			$sth = $dbh -> prepare ("
     
    				SELECT *
    				FROM Telefoonnummers
    				WHERE naam = :name
     
    			");
     
    			//voorkomen SQL-injecties
    			$sth -> bindValue( ":name", $name, PDO::PARAM_STR );
     
    			//SQL script uitvoeren
    			$sth -> execute();
     
    			//array toekennen aan $persoon
    			$persoonTemp = $sth -> fetchAll(PDO::FETCH_ASSOC);
    			$persoon = $persoonTemp[0]; //omdat de naam de primary key is en er dus maar 1 keer in kan staan komen er nooit meer dan 2 records. dus $persoon kan de 0-ste index worden
     
    			$dbName = $persoon["naam"];
    			$number = $persoon["telefoonnummer"];
    			$mobile = $persoon["mobiel"];
     
    			//$melding is FALSE
    			$melding = FALSE;
     
    			//als naam niet in database staat is $melding TRUE
    			if ( $dbName == NULL ) {
     
    				$melding = TRUE;
     
    			}
     
    				//alles wat je ziet. Formulier en evt de melding dat de naam niet is gevonden
    				//alle " (dubbele quotes) binnen print() moet een \ voor staan. Anders error! Of ' (enkele quote) ipv "
    			print("
     
    				<form action='zoeken.php' method='GET'>
     
    					<table>
     
    						<tr>
    							<td>Naam:</td> <td><input type='text' name='naam' value='$name' /></td>
    						</tr>
     
    						<tr>
    							<td>Nummer:</td> <td><input type='text' readonly='true' value='$number' /></td>
    						</tr>
     
    						<tr>
    							<td>Mobiel nummer:</td> <td><input tupe='text' readonly='true' value='$mobile' /></td>
    						</tr>
     
    						<tr>
    							<td colspan=2><input type='submit' value='Zoek nummer!' /></td>
    						</tr>
     
    					</table>
     
    				</form>
     
    			");
     
    			if ( $melding == TRUE ) {
     
    				print("Deze persoon staat niet in de database!");
     
    			}
     
    			/*
    			//laat hele array zien (1 record dus) als de persoon in de database staat
    			if ( $melding == FALSE ) {
     
    				print("<b>De array:</b> <br />");
    				print("<pre>");
    				print_r($persoon);
    				print("</pre>");
     
    			}
    			*/
     
    		?>
     
    	</body>
     
    </html>
     

    admin.php

     
    <!DOCTYPE HTML>
    <html>
     
    	<head>
    		<title>Admin</title>
    	</head>
     
     
    	<body>
     
    		<?php
     
    			//verbinding met db maken
    			$user = "root";
    			$pass = "root";
     
    			$dbh = new PDO (
    				'mysql:host=localhost; port=8473; dbname=telefoon',
    				$user,
    				$pass
    			);
     
    			//ophalen gegevens voor nieuw record
    			$toevoeg_naam = $_POST["toevoeg_naam"];
    			$toevoeg_nummer = $_POST["toevoeg_nummer"];
    			$toevoeg_mobiel = $_POST["toevoeg_mobiel"];
     
    			//toevoegen gebeurt alleen als alle gegevens zijn ingevuld
    			if ( ($toevoeg_naam != "") && ($toevoeg_nummer != "") && ($toevoeg_mobiel != "") ) {
     
    				//prepare voor toevoegen record
    				$sth_toevoeg = $dbh -> prepare ("
     
    					INSERT INTO Telefoonnummers
    					VALUES(:toevoeg_naam, :toevoeg_nummer, :toevoeg_mobiel)
     
    				");
     
    				//bindValue voor toevoegen record
    				$sth_toevoeg -> bindValue( ":toevoeg_naam", $toevoeg_naam, PDO::PARAM_STR );
    				$sth_toevoeg -> bindValue( ":toevoeg_nummer", $toevoeg_nummer, PDO::PARAM_STR );
    				$sth_toevoeg -> bindValue( ":toevoeg_mobiel", $toevoeg_mobiel, PDO::PARAM_STR );
     
    				//toevoegen nieuw record
    				$sth_toevoeg -> execute();
     
    			}
     
    			//prepare ophalen tabel Telefoonnumers
    			$sth = $dbh -> prepare ("
     
    				SELECT *
    				FROM Telefoonnummers
     
    			");
     
    			//ophalen tabel Telefoonnumers
    			$sth -> execute();
     
    			$telefoonboek = $sth -> fetchAll(PDO::FETCH_ASSOC);
     
    			/*
    			//hele telefoonboek als array
    			print("<h1>Telefoonboek:</h1>");
    			print("<pre>");
    			print_r($telefoonboek);
    			print("</pre>");
    			*/
     
    			//tableheader
    			print("<table>");
    			print("
     
    				<th>
    					<tr>
    						<td bgcolor='green' ><b>Naam</b></td>
    						<td bgcolor='green' ><b>Telefoon</b></td>
    						<td bgcolor='green' ><b>Mobiel</b></td>
    						<td bgcolor='green' ></td>
    						<td bgcolor='green' ></td>
    					</tr>
    				</th>
     
    			");
     
    			//elk record in tabel zetten
    			foreach( $telefoonboek AS $index => $record ) {
     
    				$name = $record["naam"];
    				$phone = $record["telefoonnummer"];
    				$mobile = $record["mobiel"];
     
    				print("
     
    					<tr>
    						<td>$name</td>
    						<td>$phone</td>
    						<td>$mobile</td>
    						<td><a href='wijzig_telefoonnummer.php?naam=$name'>Wijzig</a></td>
    						<td><a href='verwijder_telefoonnummer.php?naam=$name'>Verwijder</a></td>
    					</tr>
     
    				");
     
    			}
    			print("</table><br />");
     
    			//form om records toe te voegen
    			print("
     
    				<form action='admin.php' method='POST'>
    					<table>
     
    						<tr>
    							<td bgcolor='green' ><b>Naam</b></td>
    							<td bgcolor='green' ><b>Telefoonnummer</b></td>
    							<td bgcolor='green' ><b>Mobiel</b></td>
    							<td bgcolor='green' ></td>
    						</tr>
     
    						<tr>
    							<td><input type='text' name='toevoeg_naam' /></td>
    							<td><input type='text' name='toevoeg_nummer' /></td>
    							<td><input type='text' name='toevoeg_mobiel' /></td>
    							<td><input type='submit' value='Toevoegen' /></td>
    						</tr>
     
    					</table>
    				</form>
     
    			");
     
    		?>
     
    	</body>
     
    </html>
     

    wijzig_telefoonnummer.php

     
    <!DOCTYPE HMTL>
    <html>
     
    	<head>
    		<title>Wijzigen telefoonnummer</title>
    	</head>
     
    	<body>
     
    		<?php
     
    			$record_name = $_GET["naam"];
     
    			$user = "root";
    			$pass = "root";
     
    			$dbh = new PDO(
    				'mysql:host=localhost; port=8473; dbname=telefoon',
    				$user,
    				$pass
    			);
     
    			$sth = $dbh -> prepare("
     
    				SELECT *
    				FROM Telefoonnummers
    				WHERE naam = :record_name
     
    			");
     
    			$sth -> bindValue( ":record_name", $record_name, PDO::PARAM_STR );
     
    			$sth -> execute();
     
    			$printRecord = $sth -> fetchAll(PDO::FETCH_ASSOC);
     
    			/*
    			//dit record als array weergeven
    			print("<pre>");
    			print_r($printRecord);
    			print("</pre>");
    			*/
     
    			//gegevens in variabelen zetten
    			$printRecordRecord = $printRecord[0];
    			$huidigeNaam = $printRecordRecord["naam"];
    			$huidigeNummer = $printRecordRecord["telefoonnummer"];
    			$huidigeMobiel = $printRecordRecord["mobiel"];
     
    			//niet meer nodig door bovenstaande
    			/*
    			foreach( $printRecord AS $printRecordIndex => $printRecordRecord ) {
     
    				$huidigeNaam = $printRecordRecord["naam"];
    				$huidigeNummer = $printRecordRecord["telefoonnummer"];
    				$huidigeMobiel = $printRecordRecord["mobiel"];
     
    			}
    			*/
     
    			print("
     
    				<form action='wijzig.php' method='POST'>
    					<table>
     
    						<tr>
    							<td bgcolor='green'><b>Naam</b></td>
    							<td bgcolor='green'><b>Telefoonnummer</b></td>
    							<td bgcolor='green'><b>Mobiel</b></td>
    							<td bgcolor='green'></td>
    						</tr>
     
    						<tr>
    							<td><input type='text' name='naam' value='$huidigeNaam' disabled='TRUE' /></td>
    							<td><input type='text' name='nummer' value='$huidigeNummer' /></td>
    							<td><input type='text' name='mobiel' value='$huidigeMobiel' /></td>
    							<td><input type='submit' value='Wijzig' /></td>
    						</tr>
     
    					</table>
    				</form>
     
    			");
     
    		?>
     
    	</body>
     
    </html>
     

    wijzig.php

     
    <!DOCTYPE HTML>
    <html>
     
    	<head>
    		<title>Gewijzigd</title>
    	</head>
     
    	<body>
     
    		<?php
     
    			//geupdate gegevens ophalen
    			$newNaam = $_POST["naam"];
    			$newNumber = $_POST["nummer"];
    			$newMobile = $_POST["mobiel"];
     
    			print("1!");
     
    			$user = "root";
    			$pass = "root";
     
    			print("2!");
     
    			$dbh = new PDO(
    				'mysql:host=localhost; port=8473; dbname=telefoon',
    				$user,
    				$pass
    			);
     
    			print("3!");
     
    			$sth = $dbh -> prepare("
     
    				UPDATE Telefoonnummers
    				SET naam = ':naam',
    				telefoonnummer = ':nummer',
    				mobiel = ':mobiel'
    				WHERE naam = ':naam'
     
    			");
     
    			print("4!");
     
    			$sth -> bindValue( ":naam", $newNaam, PDO::PARAM_STR );
    			$sth -> bindValue( ":telefoonnummer", $newNumber, PDO::PARAM_STR );
    			$sth -> bindValue( ":mobiel", $newMobile, PDO::PARAM_STR );
     
    			print("5!");
     
    			$sth -> execute();
     
    			print("6!");
     
    			/*$sthCheck = $dbh -> prepare("
     
    				SELECT *
    				FROM Telefoonnummers
    				WHERE naam = :naam
     
    			");
     
    			$sthCheck -> bindValue( ":naam", $newNaam, PDO::PARAM_STR );
     
    			$sthCheck -> execute();*/
     
    		?>
     
    	</body>
     
    </html>
     

    Alvast bedankt!

    Bijdrager
    verwijderd-profiel

    Serieus OMT, wie maakt er nou een code tag die smiley’s maakt, en die < en > niet eens kan weergeven??

    Als je de code dus goed wilt zien moet je quoten!

    Bijdrager
    Cordini

    Lastig lezen zo, maar maar in wijzig.php wordt ‘naam’ gedefinieerd?

    Je hebt de volgende code:

     
        UPDATE Telefoonnummers
        SET naam = ':naam',
        telefoonnummer = ':nummer',
        mobiel = ':mobiel'
         WHERE naam = ':naam'
     

    Al deze variabelen zijn volgens mij niet gedefinieerd. Dit moet namelijk :newNaam, :newNummer, etc zijn. Ook heb je nu alleen de nieuwe naam in wijzig.php, niet de oude. Zorg dus dat je de oude naam ook van wijzig_telefoonnummer.php naar wijzig.php krijgt.

    Een betere oplossing is nog om een kolom ID aan je tabel toe te voegen, met een unieke ID voor elke rij.

    Bijdrager
    verwijderd-profiel

    Al die variabelen zijn via bindvalue gedefinieerd om sql injecties te voorkomen.

    Ook is het niet nodig om verschil tussen de oude en nieuwe naam te maken. Dat veld is geblokkeerd en kan dus niet worden veranderd.

    Bijdrager
    jandoornbos

    Probeer dit eens toe te voegen achter je $sth->execute(). Misschien geeft dat wat meer informatie:

     
    if ($sth->errorCode() != 0) {
     
    	$errors =  $sth->errorInfo();
    	echo $errors[2];
     
    }
     
    Bijdrager
    verwijderd-profiel

    Ik krijg geen error als ik dat erin zet.

    Bijdrager
    Wyodor

    @ Dr User

    In bestand wijzig.php heb ik dit op de gok aangepast en toen werkte het :

     
    UPDATE Telefoonnummers
                    SET naam = ':naam',
                    telefoonnummer = ':telefoonnummer',
                    mobiel = ':mobiel'
                    WHERE naam = ':naam'
     

    Dus telefoonnummer = ‘:nummer’, naar telefoonnummer = ‘:telefoonnummer’,

    De gok kwam uit dit boek :

    http://it-ebooks.info/book/732/ (pagina 232)

    Bijdrager
    Wyodor

    Zoals al eerder werd opgemerkt, is het handiger om een id toe te voegen aan het record. Alleen al omdat er meerder hondjes zijn die fikkie heten.

    Ik merkte dat met :

    name='naam' value='$huidigeNaam'  disabled='TRUE'

    je het record niet kunt updaten met

    WHERE naam = :naam';

    Je moet in het FORM dit toevoegen :

    <td><input type=’hidden’ name=’id’ value=’$huidigeID’ /></td>

    en dan updaten met

    WHERE id = :id';
    Bijdrager
    verwijderd-profiel
    Wyodor op 03 oktober 2013

    @ Dr User

    In bestand wijzig.php heb ik dit op de gok aangepast en toen werkte het :

     
    UPDATE Telefoonnummers
                    SET naam = ':naam',
                    telefoonnummer = ':telefoonnummer',
                    mobiel = ':mobiel'
                    WHERE naam = ':naam'
     

    Dus telefoonnummer = ‘:nummer’, naar telefoonnummer = ‘:telefoonnummer’,

    De gok kwam uit dit boek :

    http://it-ebooks.info/book/732/ (pagina 232)

    Ah, nu zie ik waarom. Ik had een bindvalue met :telefoonnummer gedaan! Nu werkt het wel!

    Je hebt gelijk dat er meerdere personen met dezelfde naam kunnen voorkomen maar in dit geval stond er bij de opdracht dat we daar geen rekening mee hoefden te houden.

    Een een id. toevoegen is juist iets wat ons echt is afgeleerd. We moeten zelf de beste primary (samengestelde) key kunnen bepalen.;)

    Bijdrager
    Fingerlicking

    Een id is juist om je primary te bepalen, je zou wel een unique naam kunnen maken.

    Maar deze query gaat nooit lukken als iemand zijn naam aanpast:

    Stel ik heet pietje en wil mijn naam verandere in klaas, je where clause zoekt naar klaas, dus klaas wordt nu overschreven, niet pietje.

    Bijdrager
    verwijderd-profiel

    Ik snap het, maar de naam is niet te veranderen:

     
    <td><input type='text' name='naam' value='$huidigeNaam' disabled='TRUE' /></td>
     
    Bijdrager
    Wyodor

    Dit is wat ik ervan heb gebrouwen :

    http://basilico.byethost8.com/phone/

    Bijdrager
    Fingerlicking

    Waarom een form post vanaf admin.php? Doe een onclick op de button, of een link, met je id als get. Plus, de array kan wel een trapje minder diep, scheelt weer óf een extra foreach óf $result[0].

    O, en een regex op je telefoonnummer zou ik nog ff doen, al dan niet met javascript!

    Maar verders leuk hoor!;)

    Bijdrager
    Wyodor

    Tis maar een demo, hoor.

    Bovendien gebaseerd op de code waar dit topic mee begon.

14 berichten aan het bekijken - 1 tot 14 (van in totaal 14)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.