【问题标题】:write in database (php/mySQL)写入数据库(php/mySQL)
【发布时间】:2021-07-13 09:50:16
【问题描述】:

问题很简单 (一切,php 和 html 都在一个文件中(.php))

<?php
    try {
        $bdd = new PDO('mysql:host=localhost;dbname=dlp;charset=utf8', /*the PDO works*/);
    } catch(Exception $e) {
        die('Erreur : '.$e->getMessage());
    }

    if(isset($_POST["name"], $_POST["pass"], $_POST["mail"]) 
        && !empty($_POST["name"]) && !empty($_POST["pass"]) && !empty($_POST["mail"])) { //that works
        
        if(!filter_var($_POST["mail"], FILTER_VALIDATE_EMAIL)) { //that works
            die("adresse email invalide");
        }
        $name=strip_tags(($_POST["name"]));    //that works
        $pass=password_hash($_POST["pass"], PASSWORD_ARGON2ID);    //that works
        $stmt="INSERT INTO `users` 
                        (`name`, `pass`, `mail`, `role`) 
                VALUES (:name, '$pass', :mail, '[\"ROLE_USER\"]')";
        $query=$bdd->prepare($stmt);
            $query->bindvalue(':name', $name);
            $query->bindvalue(':mail', $_POST["mail"]);

        $query->execute();
   }else{
       die('formulaire incomplet');
    }
?>

html部分:


</div>
    <form method="post">

        <section class="formulaireTitreCulture">
            <label for="name">name</label>
            <input type="name" name="name"></input>
        </section>

        <section class="formulaireTitreCulture">
            <label for="motdepasse">Mot de passe</label>
            <input id="motdepasse" name="pass"></input>
        </section>

        <section class="formulaireTitreCulture">
            <label for="">Mail</label>
            <input name="mail" id="mail">
        </section>
        <input type="submit" value="Envoyer">
    </form>
</div>      

结果是 die('formulaire incomplet');,数据库中没有写入任何内容,我不明白为什么。 欢迎任何线索!提前致谢

【问题讨论】:

  • 为什么不将密码和角色作为绑定变量以及所有其他列数据传递
  • 这个'[\"ROLE_USER\"]' 看起来有点不必要的复杂。你能解释一下你希望列数据的样子吗,所以也许我们理解你试图在那里构建的字符串
  • 我是 php 新手! '[\"ROLE_USER\"]' 是 JSON,我不确定,但我的目标是使用角色分配对数据库的定义访问权限。使用“正常”,它的工作表列是:``` id name pass mail role ```
  • 旁注:如果你正在检查!empty($_POST[...]),你也不需要isset()stackoverflow.com/questions/4559925/…
  • &lt;input type="name"... 据我所知,name 不是有效的输入类型。你的意思是id="name"?检查表单实际发送的内容。做一个var_dump($_POST);。由于您说 PHP 和表单在同一个文件中,因此在提交表单之前,首次加载时,发布的代码将始终以 die('formulaire incomplet'); 结尾。

标签: php mysql database


【解决方案1】:

首先,对所有数据使用绑定参数方法。

第二个设置 PDO 生成异常,然后如果查询没有编译或者由于其他原因失败,你会被告知。

<?php
    try {
        $bdd = new PDO('mysql:host=localhost;dbname=dlp;charset=utf8');
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $bdd->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
        $bdd->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES UTF8');
    } catch(Exception $e) {
        echo 'Erreur : '.$e->getMessage());
    }

    if(isset($_POST["name"], $_POST["pass"], $_POST["mail"]) 
        && !empty($_POST["name"]) && !empty($_POST["pass"]) && !empty($_POST["mail"])) { //that works
        
        if(!filter_var($_POST["mail"], FILTER_VALIDATE_EMAIL)) { 
            throw new Exception("adresse email invalide");
        }

        $stmt="INSERT INTO `users` 
                        (`name`, `pass`, `mail`, `role`) 
                VALUES (:name, :pass, :mail, :role)";

        $query=$bdd->prepare($stmt);
        
        $pass = password_hash($_POST["pass"], PASSWORD_ARGON2ID);

        $query->bindvalue( ':name', strip_tags($_POST["name"]) );
        $query->bindvalue( ':mail', $_POST["mail"]);
        $query->bindvalue( ':pass', $pass);
        $query->bindvalue( ':name', json_encode(["ROLE_USER"]) );

        $query->execute();
    }else{
        throw new exception('formulaire incomplet');
    }  
}
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2012-12-26
    • 2011-03-19
    • 2015-01-02
    • 2020-09-12
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多