2014-12-29 86 views
0

我是新来的PHP和SQL和所有的东西,我在看YouTube上的论坛在YouTube上的教程,并想知道为什么这个代码不提交表单时回声“成功” 。我也想知道为什么它在我提交表格之前回应失败。我已成功连接到数据库。提交表单,MySQL和PHP

<!DOCTYPE HTML> 
<html> 
    <head> 
     <title>Register</title> 
    </head> 
    <body> 
     <form action="register.php" method="POST"> 
      Username: <input type="text" name="username"> 
      <br/> 
      Password: <input type="password" name="password"> 
      <br/> 
      Confirm Password: <input type="password" name="confirmPassword"> 
      <br/> 
      Email: <input type="text" name="email"> 
      <br/> 
      <input type="submit" name="submit" value="Register"> or <a href="login.php">Log in</a> 
     </form> 
    </body> 
</html> 
<?php 
    require('connect.php'); 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $confirmPassword = $_POST['confirmPassword']; 
    $email = $_POST['email']; 

    if(isset($_POST["submit"])){ 
     if($query = mysql_query("INSERT INTO users ('id', 'username', 'password', 'email') VALUES('', '".$username."', '".$password."', '".$email."')")){ 
      echo "Success"; 
     }else{ 
      echo "Failure" . mysql_error(); 
     } 
    } 
?> 

Connect.php

<?php 

$connect = mysqli_connect("localhost", "root", "") or die("Could not connect to server!"); 
mysqli_select_db($connect, "php_forum") or die("Could not connect to database!"); 

?> 
+4

[**请勿在新代码**中使用'mysql_ *'功能](http ://bit.ly/phpmsql)。他们不再被维护[并且被正式弃用](http://j.mp/XqV7Lp)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果你选择PDO,[这里是一个很好的教程](http://j.mp/PoWehJ)。此外,此代码*开放给[SQL注入](http://bobby-tables.com/)。 – esqew

+0

显示您的connect.php – iatboy

回答

4

有几件事错在这里。

您使用的是在您的列(并且是引号)错误identifiers

('id', 'username', 'password', 'email') 

删除

(id, username, password, email) 

或使用反引号

(`id`, `username`, `password`, `email`) 

mysql_error()应该有抛出一个错误,但它并不是因为:

  • 您正在混合MySQL API与mysqli_连接,然后在您的查询中使用mysql_

这两种不同的API不会相互混淆。

使用mysqli_完全改变你的当前查询:

if($query = mysqli_query($connect, "INSERT... 

,改变mysql_error()mysqli_error($connect)

,作为该块重写:

if(isset($_POST["submit"])){ 
    if($query = mysqli_query($connect,"INSERT INTO users ('id', 'username', 'password', 'email') VALUES('', '".$username."', '".$password."', '".$email."')")){ 
     echo "Success"; 
    }else{ 
     echo "Failure" . mysqli_error($connect); 
    } 
} 

只是为了测试错误, m按照上面概述的方式改变这些变化,同时按照现在的方式保留列中的引号。然后你会看到MySQL会抛出的错误。然后,您可以像上面已经概述的那样去除列名称周围的引号,或者用反引号替换它们。

您看到的教程可能使用了反引号,但可能无法区分足以让您知道它们确实是反引号而不是单引号。

但是,您现在的代码对SQL injection开放。使用mysqli with prepared statementsPDO with prepared statements,他们更安全


我注意到你可能用纯文本存储密码。如果是这样的话,它是非常不鼓励的。

我建议你使用CRYPT_BLOWFISH或PHP 5.5的password_hash()函数。对于PHP < 5.5使用password_hash() compatibility pack


此外,而不是这样做的:

$connect = mysqli_connect("localhost", "root", "") or die("Could not connect to server!"); 
mysqli_select_db($connect, "php_forum") or die("Could not connect to database!"); 

你应该检查错误,而不是,就像手册指出

$link = mysqli_connect("myhost","myuser","mypassw","mybd") 
or die("Error " . mysqli_error($link)); 

所以你的情况:

$connect = mysqli_connect("localhost", "root", "","php_forum") 
or die("Error " . mysqli_error($connect)); 

编辑:和我改变action="register.php"action=""由于您使用在同一页内的全部代码。

<!DOCTYPE HTML> 
<html> 
    <head> 
     <title>Register</title> 
    </head> 
    <body> 
     <form action="" method="POST"> 
      Username: <input type="text" name="username"> 
      <br/> 
      Password: <input type="password" name="password"> 
      <br/> 
      Confirm Password: <input type="password" name="confirmPassword"> 
      <br/> 
      Email: <input type="text" name="email"> 
      <br/> 
      <input type="submit" name="submit" value="Register"> or <a href="login.php">Log in</a> 
     </form> 
    </body> 
</html> 
<?php 
    require('connect.php'); 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $confirmPassword = $_POST['confirmPassword']; 
    $email = $_POST['email']; 

    if(isset($_POST["submit"])){ 
     if($query = mysqli_query($connect,"INSERT INTO users (`id`, `username`, `password`, `email`) VALUES ('', '".$username."', '".$password."', '".$email."')")){ 
      echo "Success"; 
     }else{ 
      echo "Failure" . mysqli_error($connect); 
     } 
    } 
?> 
+0

谢谢,它现在呼应“成功”。感谢安全提示,我会使用它,但现在我只是试着做一些简单的工作。任何想法为什么代码在我提交表单之前运行? –

+0

@EmilØgård不客气。我看不出为什么查询会运行,怎么你有条件语句'if(isset($ _ POST [“submit”]))''。你确定你使用的是相同的代码,并且提交按钮是按照你现在的名字命名的吗? –

+0

@EmilØgård您还应该从表单中删除'或Log in',并将其放在表单标记之外。这可能是原因。你是否保留了'if(isset($ _ POST [“submit”]))'?重新加载以查看我在**下的更改,作为该块的重写:** –

0

:它将呼应;故障”,因此执行这段代码

else{ 
      echo "Failure" . mysql_error(); 
     } 

只要$ _ POST [‘提交’])未设置并且将不设置任何时候你打开你页面(即使您从Google搜索结果的书签中导航到它),或者当您在GET模式下提交FORM时