簡體   English   中英

無法更新表 php-mysql

[英]Impossible to update table php-mysql

我正在嘗試制作一種簡單的方法來更新課堂作業的表格,但它根本不起作用。 我看了很多時間我的代碼,但我找不到錯誤是什么。

下面是我的代碼的步驟:

  1. 會話開始
  2. 我有一個帶有登錄用戶名和密碼的表單
  3. 價值觀
  4. PHP服務器登錄
  5. 驗證用戶(我在網上找到了這個代碼,所以也許有更簡單的方法)
  6. 之后我有一個 IF 用戶存在,顯示另一個表單,您可以在其中編輯此用戶信息。 但似乎我的更新表不起作用。

    $sql="更新 $tbl_name SET nom=$Nom, login=$login, motdepasse=$MotDePasse, niveauacces=$NiveauAcces WHERE login=$login";

    $result=mysql_query($sql);

  7. 如果用戶不存在,則會收到錯誤消息。

問題是我的表在點擊更新表時沒有更新,它直接進入錯誤(否則)。

Bellow 是我要導入 wamp 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>

您的更新不起作用,因為您沒有將變量正確綁定到您的查詢。 將字符串綁定到查詢時使用 ( ' )。 不使用 ( ' ) 作為您的變量僅當變量的值是整數時才有效。

$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_*被棄用,因此我們建議您使用mysqli_*

建議:

我建議將您的文件分成..hmm..至少六(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>

頁腳.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';"

我省略了elogin=$login,它已經在 where 子句中使用了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM