Min query virker ikke | Byg SessionHashing til vores bruger-system i PHP
Hejsa. Jeg er kommet lidt i problemer her og håber at der er en venlig sjæl der vil kigge på min kode og se hvor jeg laver fejlen. Problemet er simpelt. Jeg kan ikke updatere min userSessionHash i mysql feltet. Jeg får simpelthen en fejl 42000
Der opstod en fejl - fejlbesked: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= 'bs_5992f7c7352414.13984452' WHERE userId = '1'' at line 1
Det er disse to linier der volder mig problemer.
$app->DatabaseUpdate('users', array($userSessionHash), array($sessionHash, $userData['userId']), "WHERE userId = ?");
login.php
<?php
include 'app.php';
$app = new minAwesomeApp();
$email = $_POST['email'];
$password = $_POST['password'];
// Test at brugeren har indtastet en gyldig e-mail adresse:
if (empty($email)) { header("Location: v5.php?goto=login&fejlkode=2"); die;}
if (empty($password)) { header("Location: v5.php?goto=login&fejlkode=3"); die;}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { header("Location: v5.php?goto=login&fejlkode=1"); die;}
// Test om brugeren er oprettet i vores database
if ($userData = $app->DatabasePrepareQueryReturnFirstField(
"SELECT * FROM users WHERE userEmail = ?",
array($email)
)
) {
// gyldig bruger, måske - vi kender email adressen
$hashedPassword = $userData['userPasswordHash'];
if (password_verify($password, $hashedPassword)) {
if (empty($userData['userSessionHash'])) {
// echo hvis sessionhash har INGEN data
$sessionHash = uniqid("bs_", true);
// Opdater noget i vores database
// DatabaseUpdate( "table", array('email'), array('[email protected]', 1), "WHERE id = ?" )
$app->DatabaseUpdate('users', array($userSessionHash), array($sessionHash, $userData['userId']), "WHERE userId = ?");
} else {
// echo hvis sessionhash har data
echo "TEST"; //"sessionHash = " . $userData['userSessionHash'];
}
} else {
// ugyldig bruger - ingen email er matchet
header("Location: v5.php?goto=login&fejlkode=4"); die;
}
} else {
// ugyldig bruger - ingen email er matchet
header("Location: v5.php?goto=login&fejlkode=4"); die;
}
// $app->DatabasePrepareQuery("SELECT * FROM users WHERE userEmail = ?", array($email)){
// // email er i databasen
// } else {
// // email eksistere ikke i databasen. Tilbage til login.php
// }
index.php (jeg kalder den for v5.php)
<?php include("app.php"); $app = new minAwesomeApp; ?>
<?php $fejlbeskeder = array();
$fejlbeskeder[1] = 'Du skal udfylde dit navn';
$fejlbeskeder[2] = 'Du skal udfylde din email adresse';
$fejlbeskeder[3] = 'Du skal udfylde et password';
$fejlbeskeder[4] = 'Du skal udfylde din gent. password';
$fejlbeskeder[5] = 'Din navn må ikke være mere end 64 tegn';
$fejlbeskeder[6] = 'Din email må ikke være mere end 64 tegn';
$fejlbeskeder[7] = 'Du skal indtaste dit fuldenavn';
$fejlbeskeder[8] = 'Du skal taste en gyldig email adresse';
$fejlbeskeder[9] = "E-mail adresseneksisteret allerede i systemet. Du er måske allerede en bruger?";
$fejlbeskeder[10] = 'Dit password skal bestå af mere end 6 tegn';
$fejlbeskeder[11] = 'Du skal indtaste samme password i begge felter';
?>
<!DOCTYPE html>
<html lang="da">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Brugersystem fra v5.dk ApS - https://v5.dk/php/">
<meta name="author" content="v5.dk">
<title>Intranet</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/v5.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="page-header">
<h1>Brugersystem</h1>
</div>
<div class="row">
<?php if(isset($_GET['fejlkode']) && !empty($_GET['fejlkode']) ) { ?>
<div class="col-md-4 col-md-offset-4">
<div class="alert alert-danger">
<?php
if ($_GET['fejlkode'] == 1) {
echo "Du har tastet ugyldig email adresse";
} elseif ($_GET['fejlkode'] == 2 ) {
echo "Du skal indtaste email adresse";
} elseif ($_GET['fejlkode'] == 3 ) {
echo "Du skal indtaste dit password";
} elseif ($_GET['fejlkode'] == 4 ) {
echo "Forket email og/eller password";
} else {
echo 'ukendt fejl';
}
?>
</div>
</div>
<?php } ?>
<?php if(isset($_GET['fejlbeskeder']) && !empty($_GET['fejlbeskeder']) ) { ?>
<div class="col-md-4 col-md-offset-4">
<div class="alert alert-danger">
<!-- Oprette login mislykket -->
<?php
echo "Følgende fejl opstod:";
$fejlbeskederGET = unserialize(urldecode($_GET[fejlbeskeder]));
if(is_array($fejlbeskederGET)){
foreach ($fejlbeskederGET as $besked) {
if (in_array($fejlbeskeder[$besked], $fejlbeskeder)) {
echo "<br>- " . $fejlbeskeder[$besked];
} else {
echo "<br>- Ukendt fejl";
}
};
} else {
echo "<br>- Ukendt fejl";
};
?>
</div>
</div>
<?php } ?>
<div class="col-md-4 col-md-offset-4">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title" id="headline">Log ind i brugersystemet</h3>
</div>
<div class="panel-body" id="loginpanel">
<form action="login.php" method="post">
<fieldset>
<div class="form-group">
<input class="form-control" placeholder="Din email adresse" name="email" type="text">
</div>
<div class="form-group">
<input class="form-control" placeholder="Password" name="password" type="password">
</div>
<input type="submit" class="btn btn-lg btn-success btn-block" value="Log ind">
</fieldset>
</form>
<hr />
<a href="#" onclick="toggleLogin()" class="btn btn-lg btn-info btn-block">Opret ny bruger</a>
</div>
<div class="panel-body" id="opretpanel" style="display: none;">
<form action="opretbruger.php" method="post">
<fieldset>
<div class="form-group">
<input class="form-control" placeholder="Fulde navn" name="navn" <?php if ( isset($_GET['navn'] ) && !empty($_GET['navn']) ) {
echo "value = '".$_GET['navn']."'";
} ?> type="text" >
</div>
<div class="form-group">
<input class="form-control" placeholder="Din email adresse" name="email" <?php if ( isset($_GET['email'] ) && !empty($_GET['email']) ) {
echo "value = '".$_GET['email']."'";
} ?> type="text">
</div>
<div class="form-group">
<input class="form-control" placeholder="Password" name="password" type="password">
</div>
<div class="form-group">
<input class="form-control" placeholder="Gentag password" name="password2" type="password">
</div>
<input type="submit" class="btn btn-lg btn-success btn-block" value="Opret bruger">
</fieldset>
</form>
<hr />
<a href="#" onclick="toggleOpretBruger()" class="btn btn-lg btn-info btn-block">Allerede medlem? Log ind</a>
</div>
</div>
</div>
</div>
</div>
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script>
function toggleLogin(){
$('#headline').html('Opret en ny bruger');
$('#loginpanel').slideUp();
$('#opretpanel').slideDown();
}
function toggleOpretBruger(){
$('#headline').html('Log ind i brugersystemet');
$('#opretpanel').slideUp();
$('#loginpanel').slideDown();
}
<?php if ( isset($_GET['goto']) && $_GET['goto'] == 'opretbruger') { ?>
$('#headline').html('Prøv igen: Opret en ny bruger');
$('#loginpanel').slideUp();
$('#opretpanel').slideDown();
<?php } ?>
</script>
</body>
</html>
app.php
<?php
// Sætter vores timezone
date_default_timezone_set('Europe/Copenhagen');
// Opsætter vores "locale" til dansk
setlocale(LC_ALL, 'da_DK.UTF-8');
// Opsætter fejlrappotering til alt pånær "notice"-beskeder
error_reporting(E_ALL ^ E_NOTICE);
// Definerer at vi gerne vil vise fejlbeskeder, sæt til 0 for at skjule fejlbeskeder
ini_set("display_errors", 1);
class minAwesomeApp {
// Database information
private static $db;
private $MySQLUsername = 'root';
private $MySQLPassword = 'root';
private $MySQLHostname = 'localhost';
private $MySQLDatabase = 'hc';
// Forbind til vores database
public function __construct() {
if (!isset(self::$db)) {
try {
self::$db = new PDO('mysql:host=' . $this->MySQLHostname .
';dbname=' . $this->MySQLDatabase .
';charset=utf8;', $this->MySQLUsername,
$this->MySQLPassword);
self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die ( '<!DOCTYPE html><html lang="da"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="Fejl i database"> <meta name="author" content="PHP-PDO Connecter fra v5.dk"> <title>Intranet - Fejl i DB.-forbindelse</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <style>.error{margin: 0 auto; text-align: center;}.error-code{bottom: 60%; color: #2d353c; font-size: 96px; line-height: 100px;}.error-desc{font-size: 12px; color: #647788;}.m-b-10{margin-bottom: 10px!important;}.m-b-20{margin-bottom: 20px!important;}.m-t-20{margin-top: 20px!important;}</style> </head> <body> <div class="container"> <div class="page-header"> <h1>Brugersystem</h1> </div><div class="error"> <div class="error-code m-b-10 m-t-20">Databasefejl <i class="fa fa-warning"></i></div><h3 class="font-bold">Der kunne ikke oprettes forbindelse til databasen</h3> <div class="error-desc"> <hr/> <h3 class="font-bold">Åbn filen "app.php" i dit projekt og tilret følgende værdier:</h3> <pre>private $MySQLUsername = "dit mysql brugernavn";<br />private $MySQLPassword = "dit mysql password";<br />private $MySQLHostname = "localhost";<br />private $MySQLDatabase = "din mysql database";</pre><pre>Fejlbesked fra server:<br />'.$e->getMessage().'</pre></div></div></div><script src="js/jquery.min.js"></script> <script src="js/bootstrap.min.js"></script> </body></html>');
}
}
}
// Hent data ud fra vores database (flere linjer)
// DatabasePrepareQuery( "SELECT * FROM table", array() )
// DatabasePrepareQuery( "SELECT * FROM table WHERE field = ?", array('Daniel') )
// DatabasePrepareQuery( "SELECT * FROM table WHERE field LIKE ?", array('%Daniel%') )
public function DatabasePrepareQuery($query,$data_array) {
try {
$stmt = self::$db->prepare($query);
$stmt->execute($data_array);
return $stmt;
} catch (PDOException $e) {
// Catch fejlbesked og echo den ud
echo 'Der opstod en fejl - fejlbesked: ' . $e->getMessage();
exit;
}
}
// Hent data ud fra vores database (éen linjer)
// DatabasePrepareQueryReturnFirstField( "SELECT * FROM table WHERE id = ?", array(1) )
public function DatabasePrepareQueryReturnFirstField($query, $data_array) {
try {
$stmt = self::$db->prepare($query);
$stmt->execute($data_array);
return $stmt->fetch();
} catch (PDOException $e) {
// Catch fejlbesked og echo den ud
echo 'Der opstod en fejl - fejlbesked: ' . $e->getMessage();
exit;
}
}
// Slet noget fra vores database
// DatabaseDelete( "table", "WHERE id = ?", array(1) )
public function DatabaseDelete($TableName, $WhereField, $WhereValues) {
if (is_array($WhereValues) && isset($WhereField) && isset($TableName)) {
try {
$prepareInsert = self::$db->prepare('DELETE FROM ' . $TableName . ' ' . $WhereField);
$prepareInsert->execute($WhereValues);
return $prepareInsert->rowCount();
} catch (PDOException $e) {
// Catch fejlbesked og echo den ud
echo 'Der opstod en fejl - fejlbesked: ' . $e->getMessage();
exit;
}
} else {
return 0;
}
}
// Sæt noget ind i vores database
// DatabaseInsert( "table", array('Navn','Email'), array('Daniel','[email protected]') )
public function DatabaseInsert($TableName, $Fields, $Values) {
$buildFields = '';
if (is_array($Fields)) {
// Loop igennem alle vores felter
foreach($Fields as $key => $field) :
if ($key == 0) {
// Første felt
$buildFields .= $field;
} else {
// Efterfølgende felter starter med ","
$buildFields .= ', ' . $field;
}
endforeach;
} else {
// Vi indsætter kun éet felt, ingen behov for overstgående loop
$buildFields .= $Fields;
}
$buildValues = '';
if (is_array($Values)) {
// Loop igennem alle vores values
foreach($Values as $key => $value) :
if ($key == 0) {
// Første
$buildValues .= '?';
} else {
// Efterfølgende starter med ","
$buildValues .= ', ?';
}
endforeach;
} else {
// Vi indsætter kun éet felt, ingen behov for overstgående loop
$buildValues .= ':value';
}
try {
$prepareInsert = self::$db->prepare('INSERT INTO '.$TableName.' ('.$buildFields.') VALUES ('.$buildValues.')');
if (is_array($Values)) {
$prepareInsert->execute($Values);
} else {
$prepareInsert->execute(array(':value' => $Values));
}
// Return last Insert ID
return self::$db->lastInsertId();
} catch (PDOException $e) {
// Catch fejlbesked og echo den ud
echo 'Der opstod en fejl - fejlbesked: ' . $e->getMessage();
exit;
}
}
// Opdater noget i vores database
// DatabaseUpdate( "table", array('email'), array('[email protected]', 1), "WHERE id = ?" )
public function DatabaseUpdate($TableName, $Fields, $Values, $WhereFields) {
$buildFields = '';
if (is_array($Fields)) {
foreach($Fields as $key => $field) :
if ($key == 0) {
$buildFields .= $field . " = ?";
} else {
$buildFields .= ', ' . $field . " = ?";
}
endforeach;
} else {
$buildFields .= $Fields . " = :value";
}
try {
$prepareInsert = self::$db->prepare('UPDATE '.$TableName.' SET '.$buildFields.' '.$WhereFields);
if (is_array($Values)) {
$prepareInsert->execute($Values);
} else {
$prepareInsert->execute(array(':value' => $Values));
}
return self::$db->lastInsertId();
} catch (PDOException $e) {
echo 'Der opstod en fejl - fejlbesked: ' . $e->getMessage();
exit;
}
}
}
#0
Hej @Saj1980
og tak for dit spørgsmål.
Lige umiddelbart ligner problemt at dit første array indeholder en variabel, denne burde i stedet indeholde felt-navnet fra din tabel i databasen, f.eks.
<?php
$app->DatabaseUpdate('users', array('userSessionHash').......);
Redigeret af @db
d. 15.08.2017 kl. 16:05 Med venlige hilsner
Daniel Bahl (@db)
CEO – v5.dk ApS