我创建了一个用户类,用于验证通过表单传递的数据,然后更新数据库表用户。我想添加额外的功能,例如检查表中是否存在用户名和电子邮件,我添加了一个小脚本,但它似乎不起作用。
我插入了一个重复的电子邮件地址,但我没有收到错误消息“电子邮件存在”,而是收到了“插入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();
}
答案 0 :(得分:1)
您需要在准备声明后使用此代码
$stmt->execute();
$stmt->store_result();
把这个
if ($result->num_rows > 0) {
echo "email exisits!";
}
而不是
if ($result->num_rows) {
echo "email exisits!";
}
答案 1 :(得分: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();
}
答案 2 :(得分: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
答案 3 :(得分:-1)
从我可以看到你没有在使用if($ result-> num_rows)测试之前为num_rows赋值,所以它总是为0