0

好的,所以我在 php 中学习准备好的语句,因为我听说它们比 mysql 更安全

所以现在我刚刚掌握了功能。我制作了一个连接到 mysql db 的函数,并将它放在我想要使用它的页面的不同文件夹中。所以我希望我的所有主要功能都在一个文件中,然后我想从我需要它们的页面上的文件中调用它们。但是现在php不喜欢它。

这是我的functions.php页面

function mysqlconnect(){

$host = 'localhost';
$port = 3306; // This is the default port for MySQL
$database = '';
$username = '';
$password = '';

// Construct the DSN, or "Data Source Name".  Really, it's just a fancy name
// for a string that says what type of server we're connecting to, and how
// to connect to it.  As long as the above is filled out, this line is all
// you need :)
$dsn = "mysql:host=$host;port=$port;dbname=$database";

// Connect!
$db = new PDO($dsn, $username, $password);
} 

这是我的测试页面,只是测试调用该函数。

include 'functions/functions.php';

mysqlconnect();

$_POST['fish'] = "shadow" ;

$statement = $db->prepare("SELECT * FROM users WHERE username = ?");
$statement->execute(array($_POST['fish']));

while ($result = $statement->fetchObject()) {
    echo $result->username;
    echo "<br />";
}

请注意,我包含该文件并调用该函数,但我得到:

注意:未定义变量:db 致命错误:在非对象上调用成员函数 prepare()

如果我将连接放在同一个 php 文件中,一切正常。但是当然 id 就像同一个文件中的所有函数一样,只要我需要它们就调用它们。我究竟做错了什么 ??

4

2 回答 2

0

$db在函数内部,不能在外部使用。查看变量范围。您可以声明$db为全局变量,也可以$db从函数返回然后设置$db=mysqlconnect()。有许多其他方法可以做到这一点,但你有它,它不能做到。

旁注:我个人会这样做:

function mysqlconnect(){
    /* your code here*/
    return $db;
}
$db = mysqlconnect();
于 2012-05-25T23:35:57.177 回答
0

$db是在函数内部定义的,所以它不能成为全局的。它的作用域在函数结束时结束。

你应该定义$db 的功能。

一个不太优雅的解决方案:

function mysqlconnect(){
  global $db; 
  $host = 'localhost';
  // etc.etc.
  $db = new PDO($dsn, $username, $password);
}

请注意,使用global,特别是在这种情况下,是一种非常糟糕的做法(它会破坏代码的清洁度、代码的可重用性,并可能导致其他几个问题)。

一个更优雅的解决方案(就像其他用户说的那样):

function mysqlconnect(){

  $host = 'localhost';
  // etc.etc.
  $db = new PDO($dsn, $username, $password);
  return $db;
}

然后在您的测试页面中:

$db = mysqlconnect();

这很有用,因为您可以使用任何变量名称:使您的代码在其他场景中更可重用。

$donaldduck = mysqlconnect();

也可以。

于 2012-05-25T23:36:05.237 回答