Php 检查MySQLi中是否已经存在该用户名

Php 检查MySQLi中是否已经存在该用户名,php,mysql,sql,login,mysqli,Php,Mysql,Sql,Login,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_

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

这是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);
?>
谁能告诉我这有什么问题吗


我从几小时前就开始做这件事了,我不知道……

您使用了错误的运算符进行转义,在您的查询中使用backtick运算符,如下所示

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

有些事情出了问题。 不要使用
mysql\u real\u escape\u string
因为您使用的是
mysqli\u*
。改用
mysqli\u real\u escape\u string
。但是最好使用
mysqli\u stmt\u bind\u param
,因为您使用的是准备好的语句。如果你使用
COUNT(*)
你总是得到一行

$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

非常感谢。我没有注意到这一点,但之后的结果仍然是一样的。-1表示反有效方法。他想知道是否已经使用了电子邮件或登录,而不是数据库中的电子邮件/登录次数,因此不使用
LIMIT 1
只是一种浪费,因为知道是否有
0
non 0
行与给定条件匹配就足够了。@MarcinOrlowski我在下面的答案中添加了
LIMIT 1
。但是使用
COUNT(*)
总是有一行@抱歉是的,理论上你是对的。它应该始终为0或1行,但没有
限制
db在找到第一行后不会停止。这就是我的观点,谢谢。我刚刚增加了限制1。这是使用预先准备好的语句的错误方式。如果您真的想使用这种语法,请使用
mysqli\u real\u escape\u string
。你看到错误消息了吗?当我尝试mysqli\u real\u escape\u字符串时,它一直在加载。我不知道为什么。我不知道如何显示错误消息,实际上我非常不懂。在打开连接后使用它,但同样,用正确的方法使用准备好的语句,就像redreggae在他的回答中描述的那样。使用
错误报告(E_ALL)显示错误消息。谢谢。我将阅读文档中的错误函数。哇,它正在工作。谢谢:$sql=mysqli_connect('localhost'、'root'、''、'bdd_name')$query=“选择COUNT(*)作为来自t_people的numrows,其中PEO_PSEUDO=?或PEO_MAIL=?LIMIT 1”$stmt=mysqli\u 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);
$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