我正在尝试一种简单的方法来更新类的表,但它根本不起作用。我看了很多次我的代码,但我找不到错误是什么。
Bellow是我的代码的步骤:
- 会话启动
- 我有一个带有登录用户名和密码的表格
- 值
- PHP服务器登录
- 验证用户(我在网上找到了这个代码,所以可能有一个更简单的方法)
-
之后,我有一个IF用户存在,显示另一个表单,在那里你可以编辑这个用户信息。但我的更新表似乎不起作用。
$sql="UPDATE$tbl_name SET nom=$nom,login=$login,motdepasse=$motdepasse,niveuaacces=$niveauacces WHERE login=$login";
$result=mysql_query($sql);
-
如果用户不存在,则会得到一个错误。
问题是,当点击更新表时,我的表没有更新,它直接导致了错误(否则)。
Bellow是我要导入到wamp phpMyAdmin中的表。
http://gavitex.com/share/85tn5rigs
数据库名称:usagers
表名:TableUsagers(将自动)
<?php
session_start();
ob_start( );
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Exercice 2</title>
</head>
<body>
<?php
if (empty($_POST["login"])||empty($_POST["motdepasse"])) {
?>
<form action="#" method="post">
<!--Nom : <input name="nom"><br>-->
Utilisateur : <input name="login"><br>
Mot de passe : <input name="motdepasse"><br>
<!--niveau d'accès : <select name="niveauacces">
<option value="1">Invité</option>
<option value="2">Usager</option>
<option value="3">Administrateur</option>
</select><br>-->
<input type="submit" name="Entrer" value="Entrer">
</form>
<?php
}else{
$host="localhost"; // Host name
$username="root"; // Mysql username
$password=""; // Mysql password
$db_name="usagers"; // Database name
$tbl_name="tableusagers"; // Table name
// Get values from form
$login=$_POST['login'];
$MotDePasse=$_POST['motdepasse'];
// Connect to server and select database.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
/* Verify if user exist */
$requete = "select login, motdepasse from $tbl_name where login='$login' AND motdepasse ='$MotDePasse'";
$verif = mysql_query($requete) or die(mysql_error());
$row_verif = mysql_fetch_assoc($verif);
$user = mysql_num_rows($verif);
if($user){
echo "Modifier des informations :<br>
<form action='#' method='post'>
Nom : <input name='nom'><br>
Utilisateur : <input name='login'><br>
Mot de passe : <input name='motdepasse'><br>
niveau d'accès : <select name='niveauacces'>
<option value='1'>Invité</option>
<option value='2'>Usager</option>
<option value='3'>Administrateur</option>
</select><br>
<input type='submit' name='modifier' value='Modifier'>
</form>";
/* Values */
if(isset($_POST['modifier'])){
$Nom=$_POST['nom'];
$NiveauAcces=$_POST['niveauacces'];
$login=$_POST['login'];
$MotDePasse=$_POST['motdepasse'];
// Update data into mysql
$sql="UPDATE $tbl_name SET nom=$Nom, login=$login, motdepasse=$MotDePasse, niveauacces=$NiveauAcces WHERE login=$login";
$result=mysql_query($sql);
}
}else{
echo "error";
}
mysql_close();
}
?>
</body>
</html>
您的更新不起作用,因为您没有将变量正确绑定到查询。将字符串绑定到查询时使用('
)。仅当变量的值为整数时,对变量不使用('
)才有效。
$sql = "UPDATE ".$tbl_name."
SET nom='$Nom',
login='$login',
motdepasse='$MotDePasse',
niveauacces='$NiveauAcces'
WHERE login='$login'";
在将变量绑定到查询之前,请确保至少使用*_real_escape_string()
来清除该值
$Nom = mysql_real_escape_string($_POST['nom']);
$NiveauAcces = mysql_real_escape_string($_POST['niveauacces']);
$login = mysql_real_escape_string($_POST['login']);
$MotDePasse = mysql_real_escape_string($_POST['motdepasse']);
问题:
提交编辑表单后,它不会进入if(isset($_POST['modifier']))
条件,因为它在第一个条件if(isset($_POST["login"]) ...)
的其他条件else {}
中。
并且mysql_*
已经被弃用,因此我们建议您使用mysqli_*
。
建议:
我建议把你的文件分成。。嗯。至少六(6)个文件。
让我们先分别为页眉(header.php)和页脚(footer.php):
header.php(所以当你必须更改标题时,你不必编辑每个文件):
<?php
session_start();
ob_start( );
include("conn.php");
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Exercice 2</title>
</head>
<body>
footer.php:
</body>
</html>
然后您的登录页面(login.php):
<?php
if(isset($_SESSION["login"])){ /* IF USER IS ALREADY LOGGED IN */
header("edit.php"); /* REDIRECT TO HOME PAGE */
}
include("header.php");
?>
<form action="process.php" method="post">
Utilisateur : <input type="text" name="login"><br>
Mot de passe : <input type="password" name="motdepasse"><br>
<input type="submit" name="Entrer" value="Entrer">
</form>
<?php include("footer.php"); ?>
以及您的编辑页面(edit.php):
include("header.php");
echo 'Modifier des informations :<br>
<form action="process.php" method="post">
Nom : <input name="nom"><br>
Utilisateur : <input type="text" name="login"><br>
Mot de passe : <input type="password" name="motdepasse"><br>
niveau d''accès : <select name="niveauacces">
<option value="1">Invité</option>
<option value="2">Usager</option>
<option value="3">Administrateur</option>
</select><br>
<input type="submit" name="modifier" value="Modifier">
</form>';
include("footer.php");
然后让我们建立与数据库的连接(conn.php):
$con = new mysqli("localhost", "root", "", "usagers");
/* CHECK CONNECTION */
if (mysqli_connect_errno()) {
printf("Connect failed: %s'n", mysqli_connect_error());
exit();
}
然后让我们有一个页面来处理所有提交的表单(process.php):
session_start();
include("conn.php");
if(isset($_POST["Entrer"])){ /* PROCESS LOGIN FORM */
$stmt = $con->prepare("SELECT login, motdepasse FROM tableusagers WHERE login = ? AND motdepasse = ?"); /* PREPARE YOUR QUERY */
$stmt->bind_param("ss", $_POST["login"], $_POST["motdepasse"]); /* BIND THESE TWO VARIABLES TO YOUR QUERY; s STANDS FOR STRING */
$stmt->execute(); /* EXECUTE THE PREPARED QUERY */
$stmt->store_result(); /* FOR THE PURPOSE OF GETTING THE NUMBER OF RESULTS */
if($stmt->num_rows > 1){ /* CHECK IF ROW RESULTS IS MORE THAN ONE */
$_SESSION["login"] = $_POST["login"]; /* STORE LOGIN DATA TO A SESSION VARIABLE */
header("LOCATION:edit.php"); /* REDIRECT TO HOME OR EDIT PAGE */
} else {
header("LOCATION:login.php"); /* REDIRECT BACK TO LOGIN PAGE */
}
$stmt->close(); /* CLOSE PREPARED STATEMENT */
}
else if(isset($_POST["modifier"])){ /* PROCESS EDIT FORM */
$stmt = $con->prepare("UPDATE tableusagers SET login = ?, motdepasse = ?, niveauacces = ? WHERE login = ?");
$stmt->bind_param("ssis", $_POST["login"], $_POST["motdepasse"], $_POST["niveauacces"]), $_SESSION["login"]);
$stmt->execute();
$stmt->close();
header("LOCATION:edit.php"); /* REDIRECT BACK TO EDIT PAGE */
}
else {
header("LOCATION:login.php");
}
尝试将散列密码存储在数据库中以提高安全性。检查php的password_hash()
。
这种方法有点极端,但我认为它仍然有效。因此,我建议您阅读更多关于面向对象编程(OOP)的内容,或者尝试不同的库(CodeIgniter、Laravel等)。
这一行似乎不正确:
$sql="UPDATE $tbl_name SET nom=$Nom, login=$login, motdepasse=$MotDePasse, niveauacces=$NiveauAcces WHERE login=$login"
试试这个:
$sql="UPDATE $tbl_name SET nom='$Nom', motdepasse='$MotDePasse', niveauacces='$NiveauAcces' WHERE login='$login';"
我省略了已经在where子句中使用的elogin=$login,
。