0

我创建了一个用户类,它验证通过表单传递的数据,然后更新数据库表用户。我想添加额外的功能,例如检查用户名和电子邮件是否存在于表中,我添加了一个小脚本,但它似乎不起作用。

我插入了一个重复的电子邮件地址,但没有收到错误消息“电子邮件存在”,而是收到了成功消息“插入了 1 行”:

我在下面做错了吗?有没有更好的方法来解决这个问题?

 public function insert() {

if (isset($_POST['submit'])) {
    $email = isset($_POST['email']) ? $this->mysqli->real_escape_string($_POST['email']) : '';

$result = $this->mysqli->prepare("SELECT * FROM users WHERE email='".$email."'");

if ($result->num_rows) {
echo "email exisits!";
} 
 else
 {
$stmt = $this->mysqli->prepare("INSERT INTO users (username, password, name, email) VALUES (?, ?, ?, ?)");
        $stmt->bind_param('ssss', $username, $password, $name, $email); // bind strings to the paramater
        //escape the POST data for added protection

$username = isset($_POST['username']) ? $this->mysqli->real_escape_string($_POST['username']) : '';
$cryptedPassword = crypt($_POST['password']);
$password = $this->mysqli->real_escape_string($cryptedPassword);
    $name = isset($_POST['name']) ? $this->mysqli->real_escape_string($_POST['name']) : '';
    $email = isset($_POST['email']) ? $this->mysqli->real_escape_string($_POST['email']) : '';
        /* execute prepared statement */
$stmt->execute();
    printf("%d Row inserted.\n", $stmt->affected_rows);
    /* close statement and connection */
$stmt->close();
            }
4

4 回答 4

1

您正在使用您可以选择的最糟糕的 API。

使用 safeMysql 会是

$exists = $this->db->getOne("SELECT 1 FROM users WHERE email=?s", $_POST['email']);
if ($exists) {
    echo "email exisits!";
} 

使用 PDO,它会稍长但可用

$stmt = $this->db->prepare("SELECT 1 FROM users WHERE email=?");
$stmt->execute(array($_POST['email']));
$exists = $stmt->fetchColumn();
if ($exists)
{
    echo "email exisits!";
} 

但是对于原始的 mysqli,您将需要一屏代码来检查用户是否存在。

因此,使用 safeMysql 的整个功能将是

public function insert()
{
    if (!isset($_POST['submit'])) {
        return FALSE;
    }

    $sql    = "SELECT 1 FROM users WHERE email=?s";
    $exists = $this->db->getOne($sql, $_POST['email']);
    if ($exists)
    {
        echo "email exisits!";
        return FALSE;

    }
    $sql     = "INSERT INTO users SET ?u";
    $allowed = array('username', 'name', 'email');
    $insert  = $this->db->filterArray($_POST, $allowed);
    $insert['password'] = crypt($_POST['password']);
    $this->db->query($sql, $insert);
    return $this->db->afectedRows();
}
于 2013-08-28T09:58:33.250 回答
1

您需要在准备语句后使用此代码

$stmt->execute();
$stmt->store_result();

把这个

if ($result->num_rows > 0) {
echo "email exisits!";
} 

代替

if ($result->num_rows) {
echo "email exisits!";
} 
于 2013-08-28T09:50:38.110 回答
0

首先,您正在使用prepare(太棒了!)但随后您只是传递了电子邮件的价值,有效地破坏了准备好的语句的好处。

其次,您从不执行查询,这就是为什么您在num_rows.

public function insert() {

$result = $this->mysqli->prepare("SELECT COUNT(*) FROM users WHERE email=?");
$result->bind_param("s", $_POST['email']);
$result->execute();
$result->bind_result($email_count);

if ($email_count) {
    echo "email exisits!";
} else {
   # your other logic
于 2013-08-28T09:58:29.970 回答
-1

据我所知,在使用 if ($result->num_rows) 测试之前,您没有为 num_rows 分配值,因此它始终为 0

于 2013-08-28T09:51:59.103 回答