我知道这已经发布了很多次,而且我已经尝试了几乎所有这个网站上的答案,但没有任何方法可行。每当我尝试运行注册过程时,即使已经使用了用户名,也会跳过if语句。 这是代码的一部分:
$username = $_POST['username'];
$password = $_POST['password'];
$sql = mysql_query("SELECT * FROM users (username, password) WHERE username = '".$username."'")
if(mysql_num_rows($sql)>0)
{
echo 'taken';
}
else
{
...
}
我还应该注意到,我看到一个帖子,有人说他们有同样的问题,因为他们必须使用mysqli,但除此之外别无其他。感谢。
答案 0 :(得分:2)
这不是最优雅的解决方案。但它会检查用户名是否存在。
if (isset($_POST["username"]) && isset($_POST["password"])) {
$username = $_POST["username"];
$password = $_POST["password"];
$stmt = $this->db->prepare('SELECT COUNT(*) FROM yourtable WHERE username=?');
$stmt->bind_param("s", $username);
$stmt->execute();
$get_instances = NULL;
$stmt->bind_result($get_instances);
$instances = NULL;
while ($stmt->fetch()) {
$instances = $get_instances;
}
$stmt->close();
if ($instances == 0) {
//whatever you want to happen
}
}
答案 1 :(得分:1)
MYSQL:此扩展在PHP 5.5.0中已弃用,并已在PHP 7.0.0中删除。相反,应使用
MySQLi
或PDO_MySQL
扩展名。
MYSQLI参考:http://php.net/manual/en/mysqli.query.php
PDO参考:http://php.net/manual/en/book.pdo.php
使用PDO的优点:
大多数PHP程序员已经发现了如何使用MySQLi和MySQL扩展。但是,PHP数据对象(PDO)提供了处理对象和检索预处理语句的方法,这使得工作变得更加容易。
PDO是PHP中的一种数据库访问工具,可以跨多个数据库进行统一访问。它不支持特定于数据库的语法,但它允许在不同平台和数据库之间进行相对无缝的切换,这可以通过更改连接字符串来完成。
以下是关于PDO的一些信息,主要针对仍在使用MySQL和MySQLi扩展的程序员,概述了前者的优越性。将在接下来的几段中研究不同的方面。
PDO扩展能够访问已为其编写PDO驱动程序的任何数据库。有许多可用的PDO驱动程序,其中一些包括用于访问Free TDS,Sybase,Microsoft SQL Server,IBM DB2,Firebird / Interbase 6,Oracle Call Interface和PostgreSQL数据库的PDO驱动程序等等。
每个系统都不会自动提供驱动程序,因此您必须找到可用的驱动程序并添加所需的驱动程序。
建立依赖于特定数据库的数据库连接有不同的语法。使用PDO时,您需要确保您的操作包含在try / catch块中,并且您要使用异常技术。
在正常情况下,只需要建立一个连接,并通过将数据库句柄编程为null来关闭连接。您可以在各种资源站点中查找更具体的选项和语法。
PDO允许使用异常进行错误处理,这就是建议您将PDO包装在try / catch块中的原因。这样,可以强制PDO进入相关的错误模式属性,以产生异常。
有三种 - 静音(默认),警告和异常 - 模式。后两者在DRY编程中更有用。 “警告”错误模式对于调试非常有用,“异常”模式允许在隐藏可能用于利用系统的数据时进行正常的错误处理。
PDO将公共插入和更新数据库操作压缩为一个简单的两步过程:Prepare >> [Bind] >> Execute
。使用此方法,您可以充分利用PDO准备好的语句,通过SQL注入为您提供防范恶意攻击的保护。
预准备语句是预先编译的SQL语句,可以通过将此数据发送到服务器来执行多次。它们的优势在于占位符中使用的数据可以自动防止SQL注入攻击。
因此,最好使用PDO,它将避免现在流行的SQL注入。
PDO代码,用于检查数据库中是否存在用户名和密码字段:
<?php
//Connections
try {
$handler = new PDO('mysql:host=localhost;dbname=s','root', '*');
$handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e){
exit($e->getMessage());
}
$name = $_POST['name'];
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$password1 = $_POST['passwordconf'];
$ip = $_SERVER['REMOTE_ADDR'];
//Verifcation
if (empty($name) || empty($username) || empty($email) || empty($password) || empty($password1)){
$error = "Complete all fields";
}
// Password match
if ($password != $password1){
$error = "Passwords do not match";
}
// Email validation
if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
$error = "Enter a Valid email";
}
// Password length
if (strlen($password) <= 6){
$error = "Choose a password longer then 6 character";
}
if(!isset($error)){
//no error
$sthandler = $handler->prepare("SELECT username FROM users WHERE username = :name");
$sthandler->bindParam(':name', $username);
$sthandler->execute();
if($sthandler->rowCount() > 0){
echo "User Already Exists.";
} else {
//Securly insert into database
$sql = 'INSERT INTO users (name ,username, email, password, ip) VALUES (:name,:username,:email,:password,:ip)';
$query = $handler->prepare($sql);
$query->execute(array(
':name' => $name,
':username' => $username,
':email' => $email,
':password' => $password,
':ip' => $ip
));
}
}else{
echo "error occured: ".$error;
exit();
}
希望这个参考可能对您自己在将来的项目中开发代码很有用。
答案 2 :(得分:-6)
此代码不安全。您应该在使用前准备收入数据。至少:
$username = addslashes(strip_tags($_POST['username']));