我有一个index.php,就像:
require_once("../resources/config.php");
require_once(LIBRARY_PATH . "/mysql.php");
...
if(checkIfMailExists($email)) {
$error = true;
$errormsg = "This e-mail is already in use!";
}
mysql.php是:
try {
$pdo = new PDO('mysql:host=' . $config['db']['db1']['host'] . ';dbname=' . $config['db']['db1']['dbname'], $config['db']['db1']['username'], $config['db']['db1']['password']);
}catch(PDOException $e){
echo "Cant connect to mysql DB!";
}
function checkIfMailExists($email) {
$query = "SELECT * FROM users WHERE email = '".$email."'";
$num = $pdo->query($query);
if($num->rowCount() > 0){
return true;
}else{
return false;
}
}
看起来,来自函数的$ pdo是未定义的。即使我删除try-catch。 我修复它的唯一方法 - 我发送$ pdo作为参数来运行,但似乎是错误的。有什么建议吗?
答案 0 :(得分:0)
PHP允许您在函数中创建局部变量,而无需执行任何操作来声明它们。刚开始使用变量,它被假定为局部变量。
这意味着如果您想要访问函数内的全局变量,则必须明确声明它:
function checkIfMailExists($email) {
global $pdo;
. . .
答案 1 :(得分:0)
发送PDO连接作为参数实际上是唯一理智的方法。确实可以使用global
关键字确实很好,但编写可维护代码的最佳方式是明确说明依赖关系,type-hinting它们
function mailExists (PDO $pdo, $email) {
$sql = 'SELECT * FROM users WHERE email = :email';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':email', $email, PDO::PARAM_STR);
$stmt->execute();
return $stmt->rowCount() > 0;
}
if (mailExists($pdo, $email) {}
阅读更多关于PDO和准备好的陈述的here。请注意我如何利用命名参数来确保此代码不能进行sql注入。