1

我在网站上有一个表单,需要在将表单数据输入数据库之前进行验证。

它通过用户 mysql_num_rows 函数检查用户名是否已经存在。但我似乎无法让它工作。测试时,它不允许添加新用户名。

这是正在使用的完整代码:

<?php
session_start();

include("databaseConnect.php");
// Insert a row of information into the table "example"


// check if username is already in database
if(mysql_num_rows(mysql_query("SELECT userName FROM registeredUsers WHERE userName =     '$_POST[userName]'"))){
 echo "Username: ". $_POST[userName]." already exists in the Database<br><br>";
    echo "You will be redirect back to the form in 5 seconds";
$ref = $_SERVER['HTTP_REFERER'];
header( 'refresh: 5; url='.$ref);

//check if hemis is already in database
}elseif(mysql_num_rows(mysql_query("SELECT hemis FROM registeredUsers WHERE hemis = '$_POST[hemis]'"))){
echo "Student [Hemis] Number: ". $_POST[hemis]." already exists in the Database<br><br>";
echo "You will be redirect back to the form in 5 seconds";
$ref = $_SERVER['HTTP_REFERER'];
header( 'refresh: 5; url='.$ref);


// if all the conditions above are fine, it will insert the data to MySQL
}else{
  mysql_query("INSERT INTO registeredUsers
(firstName, lastName, hemis, userName, MAC) VALUES('$_POST[firstName]', '$_POST[lastName]', '$_POST[hemis]', '$_POST[userName]', '$_POST[mac]' ) ")
or die(mysql_error());

echo "Data Inserted! <br><br>";
}

非常感谢 :)

4

2 回答 2

1

我会完全重写这个。它受到 SQL 注入的影响,效率低下且过于简洁。另外,您通常最好使用PHP mysqli 扩展

此外,请确保将 $_POST 变量名称括在引号中。您已将它们写为常量,而不是字符串。(除非您在代码的其他地方定义了代表字符串值的常量,否则这是一个错误。在开发时打开 PHP 警告。)

$safe_username = mysqli_real_escape_string($_POST['userName']);
$sql = "SELECT userName FROM registeredUsers WHERE userName='$safe_username' LIMIT 1";
$result = mysqli_query($database_connection, $sql);
if (mysqli_num_rows($result))
{
    // username already found code
    mysqli_free_result($result);
}
else
{
    $safe_hemis = mysqli_real_escape_string($_POST['hemis']);
    $sql = "SELECT hemis FROM registeredUsers WHERE hemis='$safe_hemis' LIMIT 1";
    // Side note, LIMIT 1 tells the database engine to stop looking after it's found one hit. More efficient as you're only looking for a Boolean value anyway.
    $result = mysqli_query($database_connection, $sql);
    if (mysqli_num_rows($result))
    {
        // hemis found code
        mysqli_free_result($result);
    }
}

其余的你可能可以从中弄清楚。

请验证并转义所有输入。验证包括检查健全性 - 数据是否在范围内(字符串长度、数字范围等)等。所有输入都是邪恶的!

您也真的不想依赖 HTTP_REFERER。用户代理并不总是通过推荐人。

另外,我知道这没什么大不了的,但使用 CSS 而不是<br>. 如果您使用的是 XHTML 文档类型,则必须正确关闭所有标签,因此<br>会变成<br />. 无论如何,这是个好主意。

于 2011-05-29T11:38:36.873 回答
1

最好也检查一下 mysql_query 的结果。它可能会返回一个您可以获得行数的结果集,但当查询失败时它可能会返回 false。在这种情况下,您将没有结果集,并且 mysql_count_rows 将失败。那失败你解释为0行。

除了 Matty 给你的所有好建议之外,我还会做一些额外的检查和严格的类型检查。

if ($result = mysql_query('....') === false)
{
  die('Your query failed in the first place. Error: ' . mysql_error());
}

您可以进行许多改进(例如在查询中使用 count 等),但我认为您至少应该进行这些检查。它将帮助您了解实际出了什么问题,而不必猜测。无论您是初学者还是经验丰富的程序员,它都会为您节省大量调试时间。

于 2011-05-29T11:54:25.803 回答