Gå til innhold

Oppdatere sql tabell med php


Anbefalte innlegg

Hei, har startet litt med php og spørringer. Prøver å oppdatere fornavn ved at man skriver inn ID og fornavn, men den vil ikke endre seg

<form action="index.php" method="POST">
<input type="text" value="ID" name="id">
<input type="text" value="Nytt navn" name="firstname">
<input type="submit" value="Lagre">
</form>

<?php
	if(!empty($_POST['id']) && !empty($_POST['firstname'])) {
		$id = $_POST['id'];
		$firstname = $_POST['firstname'];
		$query="UPDATE `users´ SET ´firstname´='$firstname' WHERE ´id´='$id'";
		mysql_query($query);
		echo $firstname. ' ';
	}
?>

Database tabellen ser sånn ut.

 

id - username - password - firstname - surname - gender

har prøvd echo $firstname, og det fungerer fint, så det må være noe med spørringen`?

 

 

prøvde også insert into, for å sette inn nye verdier i tabellen.

<form action="index.php" method="POST">
	<input type="text" value="brukernavn" name="username">
	<input type="password" value="passord" name="password">
	<input type="text" value="firstname" name="firstname">
	<input type="text" value="firstname" name="surname">
	<select name="gender">
		<option value="male">Male</option>
		<option value="female">Female</option>
	</select>
	<input type="submit" value="registrer">
</form>	

<?php

	if(!empty($_POST['username']) && !empty($_POST['password']) && !empty($_POST['firstname']) && !empty($_POST['surname'])&& !empty($_POST['gender'])) {
		$gender = $_POST['gender'];
		$username = $_POST['username'];
		$password = $_POST['password'];
		$firstname = $_POST['firstname'];
		$surname = $_POST['surname'];
		if($gender == "male" || $gender == "female") {
			$query = "INSERT INTO ´users´ VALUES('$username','$password','$firstname','$surname','$gender')";
			mysql_query($query);
		}
	}
?>

Det fungerer fortsatt ikke

Endret av jeIIy
Lenke til kommentar
Videoannonse
Annonse

 

Heisann! Hvor kobler du til selve databasen? er error_reporting skrudd på? Du må bruke prepared statements med MySQLI eller PDO i stede for gamle og utdaterte mysql_* funksjoner.

Her er et eksempel jeg skrev kjapt som viser prepared statements.

<!DOCTYPE html>
<html>
<head>
	<title>Endre bruker</title>
</head>
<body>
<?php
$dbhost 	= "localhost";
$dbname		= "test";
$dbuser		= "root";
$dbpass		= "******";
// database tilkobling med PDO
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
// Hent liste over alle brukere
$sql = "SELECT id,firstname FROM users";
$q = $conn->prepare($sql);
$q->execute();
// Hvis det er noe registrerte brukere
if($q->rowCount() >= 1) {
	echo "	<h3>Registrerte brukere:</h3>";
	$r = $q->fetchAll(5);
	// Generer tabell med liste over alle brukere
	echo "
	<table>
		<tbody>
			<tr>
				<td>ID</td>
				<td>Fornavn</td>
			</tr>";
	foreach ($r as $user) {
		echo "\n			<tr>
				<td>$user->id</td>
				<td>$user->firstname</td>
			</tr>\n";
	}
	echo "		</tbody>
	</table>\n";
}
?>
	<form action="index.php" method="POST">
		<input type="text" value="ID" name="id">
		<input type="text" value="Nytt navn" name="firstname">
		<input type="submit" value="Lagre">
	</form>
<?php
//Sjekk om det finnes input
if(!empty($_POST['id']) && !empty($_POST['firstname'])) {
	// ny brukerdata fra skjema
	$firstname = $_POST['firstname'];
	$id = (int)$_POST['id'];
	// prepared statements for sikkerhet
	// Sjekk om bruker id eksisterer
	$sql = "SELECT * FROM users where id = ?";
	$q = $conn->prepare($sql);
	$q->execute(array($id));
	//Hvis det finnes èn bruker med denne ID
	if($q->rowCount() === 1) {
		// query
		$sql = "UPDATE users
				SET firstname = ?
				WHERE id = ?";
		$q = $conn->prepare($sql);
		if($q->execute(array($firstname,$id))) {
			echo "ID:$id<br>Brukernavn:$firstname<h3>Brukeren er oppdatert.</h3>";
		}
	} else {
		//Brukerid eksisterer ikke
		die("Ingen bruker med den ID");
	}
}
?>
</body>
</html>
Endret av JanTerjeRiisOttoJohansen
Lenke til kommentar

Jeg setter pris på at du har tatt deg tid til å lage en egen kode, men jeg er veldig tidlig i php fasen, så det er ikke mye jeg får med meg. tenkte å hoppe over til mysqli eller pdo etter jeg er ferdig med litt mysql.

 

 

har koblet til databasen slik:

<?php
$conn_error = 'could not connect';
$mysql_host = '';
$mysql_user = ';
$mysql_password = '';
$mysql_database = '';


if(!mysql_connect($mysql_host, $mysql_user, $mysql_password)||!mysql_select_db($mysql_database)) {
	die($conn_error);
}

?>

Det eneste jeg får gjort er å hente verdier fra databasen. Denne fungerer helt fint

<form action="index.php" method="GET">
	<select name="gender">
	<option value="male">Male</option>
	<option value="female">Female</option>
	<input type="submit" value="send">
	</select>
</form>

<?php 
	if(isset($_GET['gender']) &&!empty($_GET['gender'])) {
		$gender = $_GET['gender'];
		if($gender == 'male' || $gender == 'female') {
			$query = "SELECT `id`, `firstname`, `surname` FROM `users` WHERE `gender`='$gender' ORDER by `id`";
			
			if($query_run = mysql_query($query)) {
				while($row = mysql_fetch_assoc($query_run)) {
					echo 'ID: <b> '.$row[id] .' </b>'. $row[firstname] .' ' . $row[surname] .'<br>';
				}
			}
		}
	}
	
	
?>
Lenke til kommentar

Ikke begynn på mysql_* og hopp over etterhvert. Begynn rett på mysqli eller pdo så det sitter i fingrene.

 

Slik setter du opp en tilkobling med PDO:

$dbhost 	= "localhost";
$dbname		= "test";
$dbuser		= "root";
$dbpass		= "******";

// database tilkobling med PDO
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);


Du henter ut fra databasen ved å bruke preparerte spørringer, lag en variabel med SQL du skal bruke slik:

$sql = "SELECT * FROM users where id = ?";

Spørsmåltegnet er der når du skal bruke preparerte spørringer slik:

$id = (int)$_POST['id'];

$q = $conn->prepare($sql);
$q->execute(array($id));

Her bruker vi et array i execute() funksjonen med variabelen $id i seg.

 

Jeg anbefaler deg å sjekke ut phpacademy sin spilleliste på youtube.

Lenke til kommentar

Testet og virker. Aner ikke hva som egentlig var feil i eskempelet ditt Jelly, men her skal du hvertfall få skrevet ut en error hvis databasetilkoblingen eller spørringen feiler:

	$link = mysqli_connect("localhost", "user", "pw", "db");
	if (mysqli_connect_errno()) {
		printf("Connect failed: %s\n", mysqli_connect_error());
		exit();
	}
	if(!empty($_POST['username']) && !empty($_POST['password']) && !empty($_POST['firstname']) && !empty($_POST['surname'])&& !empty($_POST['gender'])) {
		$gender = $_POST['gender'];
		$username = $_POST['username'];
		$password = $_POST['password'];
		$firstname = $_POST['firstname'];
		$surname = $_POST['surname'];
		if($gender == "male" || $gender == "female") {
			$insert_row = mysqli_query($link, "INSERT INTO users VALUES('$username','$password','$firstname','$surname','$gender')") or die (mysqli_error($insert_row));
		}
	}
Lenke til kommentar

Ser en feil her

$query="UPDATE `users´ SET ´firstname´='$firstname' WHERE ´id´='$id'";
Regner med at id er ett numerisk felt, men du oppgir $id som en tekst verdi. Ikke har ' rundt verdier som ikke er tekst. Mulig databasen skjønner det allikavel, men greit å gjøre ting 100% korrekt.

 

$query="UPDATE `users´ SET ´firstname´='$firstname' WHERE ´id´=$id";
For å pirke litt, skal du inkludere variabler i en tekst streng, så putt {} rundt dem slik at php vet nøyaktig hvor variablen begynner og slutter

$query="UPDATE `users´ SET ´firstname´='{$firstname}' WHERE ´id´={$id}";

// alternativt
$query="UPDATE `users´ SET ´firstname´='" . $firstname . "' WHERE ´id´=" . $id;

Er det også greit å teste at sql'en din fungerer ved å kjøre den direkte mot databasen i ett verktøy som phpmyadmin, mysql workbench, heidisql e.l. Det ser du raskt om det er en feil med sql'en eller om feilen er ett sted i php.

 

En annen ting som er viktig, og er greit å få inn i fingerspissene så tidlig som mulig. Aldri stol på bruker input, alltid valider og vask bruker input. Ta en titt på filter_input(), filter_var() og de andre filter_* funksjonene. Type casting er også greit å lese seg opp på.

  • Liker 1
Lenke til kommentar

Ser en feil her

$query="UPDATE `users´ SET ´firstname´='$firstname' WHERE ´id´='$id'";
Regner med at id er ett numerisk felt, men du oppgir $id som en tekst verdi. Ikke har ' rundt verdier som ikke er tekst. Mulig databasen skjønner det allikavel, men greit å gjøre ting 100% korrekt.

 

$query="UPDATE `users´ SET ´firstname´='$firstname' WHERE ´id´=$id";
For å pirke litt, skal du inkludere variabler i en tekst streng, så putt {} rundt dem slik at php vet nøyaktig hvor variablen begynner og slutter

$query="UPDATE `users´ SET ´firstname´='{$firstname}' WHERE ´id´={$id}";

// alternativt
$query="UPDATE `users´ SET ´firstname´='" . $firstname . "' WHERE ´id´=" . $id;
Er det også greit å teste at sql'en din fungerer ved å kjøre den direkte mot databasen i ett verktøy som phpmyadmin, mysql workbench, heidisql e.l. Det ser du raskt om det er en feil med sql'en eller om feilen er ett sted i php.

 

En annen ting som er viktig, og er greit å få inn i fingerspissene så tidlig som mulig. Aldri stol på bruker input, alltid valider og vask bruker input. Ta en titt på filter_input(), filter_var() og de andre filter_* funksjonene. Type casting er også greit å lese seg opp på.

 

 

Problemet med spørringen min var at "`" var satt feil vei. Trodde løsningen din fungerte til jeg prøvde å gjøre alt på nytt, men takk for all hjelp

Endret av jeIIy
Lenke til kommentar
  • 3 uker senere...

Ser at du allerede har fått svar på det du lurte på, men jeg bare syns en ting må nevnes en ekstra gang, ref;

 

 

Jeg setter pris på at du har tatt deg tid til å lage en egen kode, men jeg er veldig tidlig i php fasen, så det er ikke mye jeg får med meg. tenkte å hoppe over til mysqli eller pdo etter jeg er ferdig med litt mysql.

 

 

Det er mulig det ikke kom godt frem hva du ikke bør bruke og hvorfor, men det du ikke bør bruke er altså alle funksjoner som begynner med:

mysql_

Dette inkluderer altså mysql_query() som du bruker her.

 

Hvorfor bør ikke dette brukes?

Fordi disse funksjonene ble utdatert for over 8 år siden, og feil som har blitt funnet i dem siden har ikke blitt fikset, de har heller ikke fått noen forbedringer i ytelse. Videre er det en stadig økende sannsynlighet for at disse funksjonene vil bli fjernet helt i fremtidige versjoner av PHP.

 

Alternativene som her foreslåes å bruke er Mysqli og PDO, begge disse alternativene har full støtte for MySQL databaser, de har faktisk bedre støtte for MySQL enn mysql_*() funksjonene har.

De er ikke vanskeligere å bruke på noen måte, med Mysqli kan du faktisk gjøre alt helt likt som du ville gjort med mysql_* om du skulle ønske det, ved å bare legge til en "i" i funksjonsnavnet, selv om det absolutt er anbefalt å begynne med den objekt-orienterte versjonen.

 

Om du fikk eksempler for "MySQL and PHP" som innehold mysql_*, så må du gjerne fortelle hvor du fikk dem fra, slik at vi kan henge dem ut offentlig for å spre utdatert info.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...