我想创建一个函数来检查用户是否已经存在于db中。该函数存储在名为checks.php
的php文件中,并且必须返回一个值。
require 'database.php';
function exist_user( $username){
$sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');
$sth->bindParam(':email', $username);
$sth->execute();
return ($sth->rowCount() == 0) ? true : false;
}
我的database.php文件:
$server = 'localhost';
$username = 'root';
$password = '';
$database = 'auth';
try {
$conn = new PDO("mysql:host=$server;dbname=$database;", $username,
$password);
} catch (PDOException $e) {
die( "Connection failed: " . $e->getMessage());
}
我在名为exist_user()
的另一个php文件中调用register.php
:
require 'database.php';
require 'checks.php';
if (!exist_user($username)) {
//insert in the db
else{
//echo some message error
}
该错误引发了这句话: $ sth = $ conn-> prepare('SELECT email FROM users WHERE email =:$ username');
我已尝试过checks.php
文件:
database.php to checks.php
error_reporting(E_ALL); ini_set('display_errors', 1);
答案 0 :(得分:1)
你有一些错误。
首先:<{em> $conn
在user_exist
函数的scope内不存在;您需要将其作为参数传递或使用global
关键字进行访问。
function exist_user($conn, $username){
$sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');
...
}
......或......
function exist_user($username){
global $conn;
$sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');
...
}
其次:你的参数绑定有点破碎:
$sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');
$sth->bindParam(':email', $username);
那将试图从字面上绑定一个名为$username
的参数 - 你可能只想要:username
。
然后你绑定的参数不是:email
而是:username
- 即。
$sth = $conn->prepare('SELECT email FROM users WHERE email = :username');
$sth->bindParam(':username', $username);
最后: - 您可能使用return ($sth->rowCount() == 0) ? true : false;
来返回成功状态但技术上rowCount()
会返回的数量受影响的行,未检索到:
PDOStatement :: rowCount()返回受相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。
如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序。
然而如果您只是需要确定用户是否存在,您可以使用以下内容:
function exist_user($conn, $username) {
$sth = $conn->prepare('SELECT 1 AS user_exists FROM users WHERE email = :username');
$sth->bindParam(':username', $username);
if($sth->execute()) {
$result = $stc->fetch(PDO::FETCH_ASSOC);
return !empty($result['user_exists']);
}
else {
return false;
}
}
答案 1 :(得分:0)
$conn
对象是函数作用域中不存在的全局对象,全局对象既可以作为parameter
/ argument
传递给函数,也可以通过使用关键字global
。
function exist_user($username, $conn){
$sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');
$sth->bindParam(':email', $username);
$sth->execute();
return ($sth->rowCount() == 0) ? true : false;
}
或者:
function exist_user($username){
global $conn;
$sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');
$sth->bindParam(':email', $username);
$sth->execute();
return ($sth->rowCount() == 0) ? true : false;
}
我建议使用选项1,它更容易阅读,global
关键字是令人厌恶的(个人意见)。