准备好的陈述功能

时间:2012-05-25 23:31:39

标签: php mysql sql

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

所以现在我只是掌握了功能。我已经创建了一个连接到mysql数据库的函数,并将它放在我想要使用它的页面的不同文件夹中。所以我想在1个文件中的所有主要功能然后我想从我需要它们的页面上的文件中调用它们。但现在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就像同一个文件中的所有函数一样,只要我需要它们就调用它们。我做错了什么?

2 个答案:

答案 0 :(得分:0)

$db位于函数内部,无法在外部使用。看看Variable Scope。您可以将$db声明为全局变量,也可以从函数返回$db,然后设置$db=mysqlconnect()。有许多其他方法可以做到这一点,但正如你所拥有的那样,它无法完成。

旁注:我个人会这样做:

function mysqlconnect(){
    /* your code here*/
    return $db;
}
$db = mysqlconnect();

答案 1 :(得分:0)

$db在函数内定义,因此无法变为全局。当函数结束时,它的范围结束。

您应该定义$db outisde 您的功能。

一个不那么优雅的解决方案:

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();

也可以。