使用PDO prepare和INSERT在数据库中输入的表单

时间:2014-09-30 14:28:59

标签: php mysql pdo

出于某种原因,当我填写我的基本注册表时没有出错,它表示一切都已完成,但当我去看看我的数据库时,没有任何内容保存在那里。

这是我的表格:

<form method="post">
        <p id="registryinput">Voornaam:<input name="voornaam" type="text"></p><br>
        <p id="registryinput">Tussenvoegsels:<input name="tussenvoegsel" type="text"></p><br>
        <p id="registryinput">Achternaam:<input name="achternaam" type="text"></p><br>
        <p id="registryinput">E-mail:<input name="email" type="text"></p><br>
        <p id="registryinput">Wachtwoord:<input name="wachtwoord" type="password"></p><br>
        <p id="registryinput">Herhaal wachtwoord:<input name="herhaalwachtwoord" type="password"></p><br>
        <input name="submit" type="submit" value="Registreren">
    </form>

这是数据库连接:

<?php
    $host_name = "localhost";
    $database = "login";
    $username = "root";
    $password = "";

    try {
        $db = new PDO("mysql:host=".$host_name.";dbname=".$database,$username,$password);
    }
    catch (PDOException $e) {
        print "Error!: ".$e->getMessage()."<br/>";
        die();
    }   
?>

这是我用来上传到数据库的代码:

<?php
        include("connect.php");

        $voornaam = @$_POST["voornaam"];
        $tussenvoegsel = @$_POST["tussenvoegsel"];
        $achternaam = @$_POST["achternaam"];
        $email = @$_POST["email"];
        $wachtwoord = @$_POST["wachtwoord"];
        $herhaalwachtwoord = @$_POST["herhaalwachtwoord"];
        $submit = @$_POST["submit"];
        $encpassword = md5($password);

        if($submit){
            if($voornaam==true){
                if($achternaam==true){
                    if($email==true){
                        if($wachtwoord==true){
                            if($herhaalwachtwoord==true){
                                if($wachtwoord==$herhaalwachtwoord){
                                    if(strlen($voornaam)<50){
                                        if(strlen($tussenvoegsel)<50){
                                            if(strlen($achternaam)<50){
                                                if(strlen($email)<50){
                                                    if(strlen($wachtwoord)<50){
                                                        $q = $db->prepare("INSERT INTO 'userinfo' ('voornaam','tussenvoegsel','achternaam','email','wachtwoord') VALUES (':voornaam',':tussenvoegsel',':achternaam',':email',':wachtwoord')");
                                                        $q->execute(array(':voornaam'=>$voornaam,':tussenvoegsel'=>$tussenvoegsel,':achternaam'=>$achternaam,':email'=>$email,':wachtwoord'=>$wachtwoord));
                                                        echo "Registratie succesvol!";
                                                    } else {
                                                        echo "Wachtwoord langer dan 50 karakters.";
                                                    }
                                                } else {
                                                    echo "E-mail langer dan 50 karakters.";
                                                }
                                            } else {
                                                echo "Achternaam langer dan 50 karakters.";
                                            }
                                        } else {
                                            echo "Tussenvoegsel langer dan 50 karakters.";
                                        }
                                    } else {
                                        echo "Voornaam langer dan 50 karakters.";
                                    }
                                } else {
                                    echo "Wachtwoorden zijn niet gelijk.";
                                }
                            } else {
                                echo "Herhaal uw wachtwoord.";
                            }
                        } else {
                            echo "Geen wachtwoord ingevuld.";
                        }
                    } else {
                        echo "Geen e-mail ingevuld.";
                    }
                } else {
                    echo "Geen achternaam ingevuld.";
                }
            } else {
                echo "Geen voornaam ingevuld.";
            }
        }   
    ?>

我主要担心的是这部分是否正确:

$q = $db->prepare("INSERT INTO 'userinfo' ('voornaam','tussenvoegsel','achternaam','email','wachtwoord') VALUES (':voornaam',':tussenvoegsel',':achternaam',':email',':wachtwoord')");
$q>execute(array(':voornaam'=>$voornaam,':tussenvoegsel'=>$tussenvoegsel,':achternaam'=>$achternaam,':email'=>$email,':wachtwoord'=>$wachtwoord));

不要介意我荷兰的所有价值名称,因此页面上的所有文字都是荷兰语

我实际上工作了一点点并且放弃了另一个问题,我的第二个目标是使用SELECT *选项创建一个登录表单,我得到它的工作。唯一的问题是用户名我正在使用电子邮件,但当它试图调用电子邮件的价值(例如Thodor20@gmail.com)时,它会出现这个错误:

致命错误:未捕获的异常&#39; PDOException&#39; with message&#39; SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在&#39; @ gmail.com =&#39; admin&#39;&#39;&#39;&#39;&#39;&#39;在第1行&#39;在第15行的C:\ wamp \ www \ PWS \ index.php中 (!)PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在&#39; @ gmail.com =&#39; admin&#39;&#39;&#39;&#39;&#39;&#39;在第15行的C:\ wamp \ www \ PWS \ index.php第1行

我知道为什么这不起作用,虽然它将电子邮件识别为Thodor20@gmail.com,其中@ gmail.com因为@而分离。 那么我该如何更改现有代码:

<?php
    include("connect.php");

    $logemail = @$_POST['email'];
    $logww = @$_POST['wachtwoord'];

    if(isset($_POST['submit'])){
        $q2 = $db->prepare("SELECT * FROM userinfo WHERE $logemail = '$logww'");
        $q2->execute(array(':email'=>$logemail,':wachtwoord'=>$logww));
        echo "Login succesvol!";
    }
?>

形式:

<form method="post">
    E-mail:<input type="text" name="email"><br>
    Wachtwoord:<input type="password" name="wachtwoord"><br>
    <input type="submit" name="submit" value="Inloggen"><br>
</form>

所以它会接受Thodor20@gmail.com作为1个完整值而不是部分?

2 个答案:

答案 0 :(得分:3)

您在表格,列和占位符周围使用引号,将其删除。

这些不是正确的identifiers

INSERT INTO userinfo (voornaam,tussenvoegsel,achternaam,email,wachtwoord)   
VALUES (:voornaam,:tussenvoegsel,:achternaam,:email,:wachtwoord)

使用

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
在连接打开后,

会发出错误信号。

$q>execute缺少-,因此将其更改为$q->execute箭头操作符格式错误。 (虽然你似乎在你的全部代码中都有它),但值得一提的是以防万一。


我还注意到您正在使用if($submit){通常最好使用

if(isset($_POST['submit'])){...}

@使用@$_POST符号会抑制errors。最好不要使用它们。


密码存储

您正在使用MD5进行密码存储md5($password) 这已不再被认为是安全的。

我建议您使用CRYPT_BLOWFISH或PHP 5.5&#39; password_hash()功能 对于PHP&lt; 5.5使用password_hash() compatibility pack

答案 1 :(得分:1)

不,SQL文本不正确。标识符不包含在单引号中。

INSERT INTO 'userinfo' ('voornaam','tussenvoegsel'
            ^        ^  ^        ^ ^             ^

(当MySQL看到单引号时,它会看到一个字符串文字,而不是表名或列名。)

修复方法是从SQL文本中删除所有这些单引号。

如果标识符需要转义,则可以用反引号字符括起来。 (时髦的后面引用字符,不方便地位于键盘左侧的键上。

INSERT INTO `userinfo` (`voornaam`,`tussenvoegsel`