无法理解PHP/MySQL用户注册功能…

无法理解PHP/MySQL用户注册功能…,php,mysql,Php,Mysql,首先,我天生不是程序员,所以我很难理解下面的脚本中发生了什么,这些脚本来自用户注册表单的大量资源: if (mysqli_query($dbconnect, $sql)) { header("Location: registered.php"); } else { $_SESSION['error_reg']['email'] = "This email address is already registered."; } 在这个代码段中,$dbconnect包含使用MySQL

首先,我天生不是程序员,所以我很难理解下面的脚本中发生了什么,这些脚本来自用户注册表单的大量资源:

if (mysqli_query($dbconnect, $sql))
{
    header("Location: registered.php");
}
else
{
    $_SESSION['error_reg']['email'] = "This email address is already registered.";
}
在这个代码段中,$dbconnect包含使用MySQL的MySQL连接脚本,$sql包含sql表插入代码。最后,会话信息将错误消息注入到表单下的另一个脚本中

我的问题围绕着脚本如何知道电子邮件地址是否存在于它工作的表中,而不必从表中选择行。我一直在认真地琢磨它是如何工作的,但我还没有明确地将它编码成这样

我希望这还不够含糊……除了一些表单字段验证和捕获表单变量以插入到$sql表中之外,脚本实际上没有更多内容

谢谢

我的问题是脚本如何知道表中是否存在电子邮件地址

在这种情况下,它实际上不知道。它假定。这实际上是一个非常糟糕的功能示例。此代码假定数据库查询的任何失败都意味着电子邮件地址已注册

如果在执行查询时出现语法错误、数据库引擎故障等任何故障,那么mysqli_query$dbconnect,$sql将返回false。此代码将该错误值解释为它显示的特定错误消息。

它不可能工作。mysqli_查询有两个可能的返回值:如果查询成功,则返回语句句柄/对象;如果查询彻底失败,则返回布尔值false

不返回行的查询,例如select。。其中1=0不是故障。这是一个完全有效的查询,只是碰巧有一个空的结果集

正确的代码顺序应为:

$result =  mysqli_query(...) or die(mysqli_error($dbconnct));
if (mysqli_num_rows($result) == 0) {
    return "not registered";
} else {
    return "already exists";
}

啊,好的!所以,我假设它在起作用,而事实并非如此。这是我可以用来跑步的好信息。谢谢大家!@蒂姆萨莫夫:嗯,它可能会起作用。在大多数情况下,它是有效的,因为它可能没有针对意外的错误条件进行测试。这与没有刹车的汽车在不测试其停车能力的情况下似乎在工作的情况大致相同。对不起,还有一个问题……为什么只有当电子邮件与数据库中的电子邮件相同时才会出现错误?@TimSamoff:这取决于执行的SQL查询。如果查询试图在对该列具有唯一约束的表中插入具有重复值的记录,则查询将导致错误。这段代码关于那个错误的假设,在那个特定的情况下,恰好是正确的。好的!这对我来说是有道理的。我敢打赌这就是正在发生的事情,$sql查询将是相关的。如果它是一个带有现有DB表约束的INSERT,这就解释了为什么它可能会1因重复地址而失败,2因此得到了简单的If检查。是的,这就是我所研究的-这就是为什么我想知道它为什么会工作的原因。我很确定@David对发生的事情的评估是正确的。那么,是的,如果它正在进行插入并检查失败,那会起作用,但由于您从未显示$sql中的内容……这是因为$sql没有检查错误:$sql=插入到用户af_用户名、af_电子邮件、af_密码、af_注册表、af_令牌值中{$username}'、{$email}'、{$password}'、{$reg}'、{$token}';但是,由于我已经验证了DB列是唯一的,所以它返回了一个错误。