无法更新表php-mysql

时间:2016-04-05 22:46:09

标签: php mysql

我正在尝试为类工作更新表格,但它根本不起作用。我看了很长时间的代码,但我找不到错误。

Bellow是我的代码的步骤:

  1. 会话开始
  2. 我有一个包含登录用户名和密码的表单
  3. PHP服务器登录
  4. 验证用户(我在网上找到了这个代码,所以可能有更简单的方法)
  5. 之后我有一个IF用户,显示另一个表单,您可以在其中编辑此用户信息。 但似乎我的更新表不起作用。

    $ sql =“UPDATE $ tbl_name SET nom = $ Nom,login = $ login,motdepasse = $ MotDePasse,niveauacces = $ NiveauAcces WHERE login = $ login”;

    $结果= mysql_query($ SQL);

  6. 如果用户不存在,则会收到错误。

  7. 问题是当我点击更新表时我的表没有更新,而且它直接错误地显示(否则)。

    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>
    

2 个答案:

答案 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,