PHP不会将数据保存到DB

时间:2016-03-07 07:54:00

标签: php mysql

我的PHP脚本有问题。当我尝试保存数据时,它显示错误。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <link rel="stylesheet" type="text/css" href="style.css" />
</head>    
<body>
<?php
    require_once 'user.php';

    if ( (isset($_POST["send"])) && ($_POST["send"] == 1)) {
        if ( isset($_Post["login"]) ){ 
            $login = mysql_real_escape_string(htmlspecialchars($_POST["login"])); 
        } else { 
            $login=''; 
        }

        if ( isset($_Post["pass"]) ){ 
            $login = mysql_real_escape_string(htmlspecialchars($_POST["pass"])); 
        } else { 
            $pass=''; 
        }

        if ( isset($_Post["pass_v"]) ){ 
            $login = mysql_real_escape_string(htmlspecialchars($_POST["pass_v"])); 
        } else { 
            $pass_v=''; 
        }

        if ( isset($_Post["email"]) ){ 
            $login = mysql_real_escape_string(htmlspecialchars($_POST["email"])); 
        } else { 
            $email=''; 
        }

        if ( isset($_Post["emai_v"]) ){ 
            $login = mysql_real_escape_string(htmlspecialchars($_POST["email_v"])); 
        } else { 
            $email_v=''; 
        }

        $existsLogin = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM login WHERE login='$login' LIMIT 1"));
        $existsEmail = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM Email WHERE email='$email' LIMIT 1"));

        $errors = ''; 

        if (!$login || !$email || !$pass || !$pass_v || !$email_v ) $errors .= '- Musisz wypełnić wszystkie pola<br />';
        if ($existsLogin[0] >= 1) $errors .= '- Ten login jest zajęty<br />';
        if ($existsEmail[0] >= 1) $errors .= '- Ten e-mail jest już używany<br />';
        if ($email != $email_v) $errors .= '- E-maile się nie zgadzają<br />';
        if ($pass != $pass_v)  $errors .= '- Hasła się nie zgadzają<br />';

        if ($errors != '') {
            echo '<p class="error">Rejestracja nie powiodła się, popraw następujące błędy:<br />'.$errors.'</p>';
        } else {
            $pass = user::passSalter($pass);

            try {
                $pdow = new PDO('mysql:host=localhost;dbname=log_cdr', 'root', 'slawek132');
                $pdow->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $sqlw = "INSERT INTO login (login, pass, pass_v, email, email_v) VALUES ('['login']','['pass']','['pass_v']','['email']','['email_v']')";

                if ($pdow->query($sqlw)) {
                    echo "<script type= 'text/javascript'>alert('Dane użytkownika zapisane poprawnie.');</script>";
                } else{
                    echo "<script type= 'text/javascript'>alert('Niepoprawne zapisanie danych użytkownika!');</script>";
                }

                $pdow = null;
            } catch(PDOException $w) {
                echo $w->getMessage();
            }

            //mysql_query("INSERT INTO log_cdr (login, email, email_v, pass, pass_v) VALUES('$login','$email','$pass');") or die ('<p class="error">Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika.</p>');

            echo '<p class="success">'.$login.', zostałeś zarejestrowany.<br /><a href="login.php">Logowanie</a></p>';
        }
    }
?>

<form method="post" action="">    
 <label for="login">Wprowadź nazwę użytkownika</label>
 <input maxlength="32" type="text" name="pass_v" placeholder="Wprowadź nazwę użytkownika"/>

 <label for="pass">Wprowadź hasło</label>
 <input maxlength="32" type="password" name="pass_v" placeholder="Wprowadź hasło"/>

 <label for="pass_again">Wprowadź ponownie hasło</label>
 <input maxlength="32" type="password" name="pass_v" placeholder="Wprowadź ponownie hasło"/>

 <label for="email">Wprowadź E-mail</label>
 <input type="text" name="email" maxlength="50" id="email" placeholder="Wprowadź Email"/>

 <label for="email_again">Potwierdź Email</label>
 <input type="text" maxlength="255" name="email_v" id="email_again" placeholder="Wprowadź ponownie Email"/><br />


 <input type="hidden" name="send" value="1" />
 <input type="submit" value="Zarejestruj" />
 <input type="submit" value="Zmień hasło" />
 <a href="logout.php"><input type="button" value="Wyloguj" name="Wyloguj"/ ></a>
</form>

<?php
require 'footer.php';
?>

</body>
</head>

错误讯息:

  

警告:mysql_fetch_array()要求参数1为资源,第45行的C:\ xampp \ htdocs \ CDR \ register.php中给出布尔值
  警告:mysql_fetch_array()期望参数1为资源,第46行的C:\ xampp \ htdocs \ CDR \ register.php中给出布尔值

我更正了:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
 <link rel="stylesheet" type="text/css" href="style.css" />
</head>

<body>

<?php



require_once 'user.php';



                try {
                $pdow = new PDO('mysql:host=localhost;dbname=log_cdr', 'root', 'slawek132');
                $pdow->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $sqlw = "INSERT INTO login (login, pass, pass_v, email, email_v)
                VALUES ('['login']','['pass']','['pass_v']','['email']','['email_v']')";
                if ($pdow->query($sqlw)) {
                echo "<script type= 'text/javascript'>alert('Dane użytkownika zapisane poprawnie.');</script>";
                }
                else{
                echo "<script type= 'text/javascript'>alert('Niepoprawne zapisanie danych użytkownika!');</script>";
                }

                $pdow = null;
                }
                catch(PDOException $w)
                {
                echo $w->getMessage();
                }


$result = $mysqeli->query("SELECT COUNT(*) FROM log_cdr WHERE login='$login' LIMIT 1"); // btw, this query is vulnerable to SQL injection
$existsLogin = $result->fetch_array();



if ( (isset($_POST["send"])) && ($_POST["send"] == 1)) {

    if ( isset($_POST["login"]) ){ 
        $login = mysql_real_escape_string(htmlspecialchars($_POST["login"])); 
        } else { 
        $login=''; 
}
    if ( isset($_POST["pass"]) ){ 
        $login = mysql_real_escape_string(htmlspecialchars($_POST["pass"])); 
        } else { 
        $pass=''; 
}
    if ( isset($_POST["pass_v"]) ){ 
        $login = mysql_real_escape_string(htmlspecialchars($_POST["pass_v"])); 
        } else { 
        $pass_v=''; 
}
    if ( isset($_POST["email"]) ){ 
        $login = mysql_real_escape_string(htmlspecialchars($_POST["email"])); 
        } else { 
        $email=''; 
}
    if ( isset($_POST["emai_v"]) ){ 
        $login = mysql_real_escape_string(htmlspecialchars($_POST["email_v"])); 
        } else { 
        $email_v=''; 
}


$existsLogin = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM log_cdr WHERE login='$login' LIMIT 1"));
$existsEmail = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM log_cdr WHERE email='$email' LIMIT 1"));

    $errors = ''; 



    if (!$login || !$email || !$pass || !$pass_v || !$email_v ) $errors .= '- Musisz wypełnić wszystkie pola<br />';
    if ($existsLogin[0] >= 1) $errors .= '- Ten login jest zajęty<br />';
    if ($existsEmail[0] >= 1) $errors .= '- Ten e-mail jest już używany<br />';
    if ($email != $email_v) $errors .= '- E-maile się nie zgadzają<br />';
    if ($pass != $pass_v)  $errors .= '- Hasła się nie zgadzają<br />';

    if ($errors != '') {
        echo '<p class="error">Rejestracja nie powiodła się, popraw następujące błędy:<br />'.$errors.'</p>';
    }

    else {


        $pass = user::passSalter($pass);





        //mysql_query("INSERT INTO log_cdr (login, email, email_v, pass, pass_v) VALUES('$login','$email','$pass');") or die ('<p class="error">Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika.</p>');

        echo '<p class="success">'.$login.', zostałeś zarejestrowany.
        <br /><a href="login.php">Logowanie</a></p>';
    }
}
?>

<form method="post" action="">

 <label for="login">Wprowadź nazwę użytkownika</label>
 <input maxlength="32" type="text" name="pass_v" placeholder="Wprowadź nazwę użytkownika"/>

 <label for="pass">Wprowadź hasło</label>
 <input maxlength="32" type="password" name="pass_v" placeholder="Wprowadź hasło"/>

 <label for="pass_again">Wprowadź ponownie hasło</label>
 <input maxlength="32" type="password" name="pass_v" placeholder="Wprowadź ponownie hasło"/>

 <label for="email">Wprowadź E-mail</label>
 <input type="text" name="email" maxlength="50" id="email" placeholder="Wprowadź Email"/>

 <label for="email_again">Potwierdź Email</label>
 <input type="text" maxlength="255" name="email_v" id="email_again" placeholder="Wprowadź ponownie Email"/><br />


 <input type="hidden" name="send" value="1" />
 <input type="submit" value="Zarejestruj" />
 <input type="submit" value="Zmień hasło" />
 <a href="logout.php"><input type="button" value="Wyloguj" name="Wyloguj"/ ></a>
</form>

<?php
require 'footer.php'; 
?>

</body>
</html>

并且有错误:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'login']','['pass']','['pass_v']','['email']','['email_v']')' at line 2
Notice: Undefined variable: mysqeli in C:\xampp\htdocs\CDR\register.php on line 38

Fatal error: Call to a member function query() on null in C:\xampp\htdocs\CDR\register.php on line 38

2 个答案:

答案 0 :(得分:1)

您正在将deprecated mysql_*函数与更现代的PDO接口混合。

只要您在开始时没有mysql_connect()来电,mysql_*功能将无效。

mysql_query()在无法连接到数据库时返回false,从而导致出现错误消息。

将代码更改为仅使用PDO。

另一件事,$_Post将不起作用。 PHP区分大小写,正确的变量名称为$_POST

答案 1 :(得分:0)

您必须将mysql_connect的结果作为第一个参数传递给mysql_fetch_array。但不推荐使用mysql扩展程序,请使用mysqliPDO

$db = new mysqli('127.0.0.1', 'your_user', 'your_pass', 'your_db');
$result = $mysqli->query("SELECT COUNT(*) FROM login WHERE login='$login' LIMIT 1"); // btw, this query is vulnerable to SQL injection
$existsLogin = $result->fetch_array();

可以找到更多示例here

另请参阅How can I prevent SQL injection in PHP?