我正在尝试为类工作更新表格,但它根本不起作用。我看了很长时间的代码,但我找不到错误。
Bellow是我的代码的步骤:
之后我有一个IF用户,显示另一个表单,您可以在其中编辑此用户信息。 但似乎我的更新表不起作用。
$ sql =“UPDATE $ tbl_name SET nom = $ Nom,login = $ login,motdepasse = $ MotDePasse,niveauacces = $ NiveauAcces WHERE login = $ login”;
$结果= mysql_query($ SQL);
如果用户不存在,则会收到错误。
问题是当我点击更新表时我的表没有更新,而且它直接错误地显示(否则)。
Bellow是我的表格导入到phpMyAdmin。
http://gavitex.com/share/85tn5rigs
数据库名称:使用者
表名: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>
答案 0 :(得分:2)
您的更新无效,因为您没有将变量正确绑定到查询中。将字符串绑定到查询时使用('
)。不使用('
)变量只有在变量值为整数时才有效。
$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']))
条件,因为它位于第一个条件else {}
的其他条件if(isset($_POST["login"]) ...)
内。
mysql_*
已经deprecated,因此我们建议您使用mysqli_*
。
我建议将您的文件分成..hmm..at至少六(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等)。
答案 1 :(得分:1)
这条线似乎不合适:
$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,
。