2013-05-05 140 views
0

我试图在创建新用户之前检查输入字段中的用户名和电子邮件是否已经存在于我的数据库中。用MySQLi检查用户名是否已经存在

这是login.php中:

<?php 
session_start(); 
$pseudo = $_POST['pseudo']; 
$mail = $_POST['mail']; 

$pseudo=mysql_real_escape_string($pseudo); 
$pseudo=ltrim($pseudo); 
$pseudo=rtrim($pseudo); 

$mail=mysql_real_escape_string($mail); 
$mail=trim($mail); 

$sql=mysqli_connect('localhost','root','','bdd_name'); 
$query=("SELECT COUNT(*) FROM t_people WHERE 'PEO_PSEUDO'='".$pseudo."' OR 'PEO_MAIL'='".$mail."'"); 
$result = mysqli_prepare($sql,$query); 

    mysqli_stmt_execute($result); 
    mysqli_stmt_store_result($result); 

if (mysqli_stmt_num_rows($result) == 0) { 
    echo 1; 
} 
else { 
echo 2; 
} 
mysqli_stmt_free_result($result); 
mysqli_stmt_close($result); 
?> 

这是我的JavaScript的一部分:

var pseudo=$("#pseudo").val(); 
var mail=$("#mail").val(); 
    $.ajax({ 
     type: "POST", 
     url: "login.php", 
     data: {pseudo:pseudo, mail:mail} 
     }).done(function(result) { 
      if (result==1) { 
       good(); 
      } 
      else if (result==2) { 
       bad(); 
      } 
     }); 

谁能告诉我什么是错的呢?

我在这头,因为小时了,我无言以对......

+0

这是使用预处理语句的错误的方式。如果你真的想使用这个语法,使用'mysqli_real_escape_string'。你看到错误信息吗? – 2013-05-05 12:21:12

+0

当我尝试mysqli_real_escape_string时,它不断加载。我不知道为什么。而且我不知道如何显示错误信息,实际上我很小心。 – Nico 2013-05-05 12:30:25

+0

*在打开连接之后使用*,但同样,使用准备好的语句正确的方式,就像他在回答中描述的redreggae一样。使用'error_reporting(E_ALL);'显示错误消息。 – 2013-05-05 12:36:38

回答

0

有一些事情出错了。 请勿使用mysql_real_escape_string因为您正在使用mysqli_*。改为使用mysqli_real_escape_string。但更好地使用mysqli_stmt_bind_param,因为您正在处理准备好的语句。如果你与COUNT(*)一起工作,你总会得到1排。

$pseudo = $_POST['pseudo']; 
$mail = $_POST['mail']; 

$query = "SELECT * FROM t_people WHERE PEO_PSEUDO = ? OR PEO_MAIL = ? LIMIT 1"; 
$stmt = mysqli_prepare($sql, $query); 
mysqli_stmt_bind_param($stmt, 'ss', $pseudo, $mail); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_store_result($stmt); 
$numRows = mysqli_stmt_num_rows($stmt); 
mysqli_stmt_close($stmt); 

随着COUNT(*)(这是更有效的),它是这样:

$query = "SELECT COUNT(*) as numrows FROM t_people WHERE PEO_PSEUDO = ? OR PEO_MAIL = ?"; 
... 
mysqli_stmt_execute($stmt); 
mysqli_stmt_bind_result($stmt, $numRows); 
mysqli_stmt_fetch($stmt); 
mysqli_stmt_close($stmt); 

// work with $numRows 
+0

哇,它现在工作。 谢谢: $ sql = mysqli_connect('localhost','root','','bdd_name'); $ query =“SELECT COUNT(*)as numrows FROM t_people WHERE PEO_PSEUDO =?OR PEO_MAIL =?LIMIT 1”; $ stmt = mysqli_prepare($ sql,$ query); mysqli_stmt_bind_param($ stmt,'ss',$ pseudo,$ mail); mysqli_stmt_execute($ stmt); mysqli_stmt_bind_result($ stmt,$ numRows); mysqli_stmt_fetch($ stmt); echo $ numRows; mysqli_stmt_close($ stmt); – Nico 2013-05-05 13:13:31

1

您正在使用错误的运营商在查询中使用逃逸反引号运算符这样

"SELECT COUNT(*) FROM t_people WHERE `PEO_PSEUDO`='".$pseudo."' OR `PEO_MAIL`='".$mail."'" 
+0

谢谢。我没有注意到,但结果仍然是一样的。 – Nico 2013-05-05 12:18:09

+0

-1为计数器有效的方法。他想知道电子​​邮件或登录信息是否已被使用,而不是数据库中有多少电子邮件/登录信息,因此不使用'LIMIT 1'只是一种浪费,因为知道是否有'0'或'non' 0行匹配给定的标准。 – 2013-05-05 12:46:47

+0

@MarcinOrlowski我在下面的答案中加了'LIMIT 1'。但是用'COUNT(*)'总是有1行?! – bitWorking 2013-05-05 12:53:33

相关问题