0

我正在尝试在函数内执行查询,但它返回“未选择数据库”。我经常重新初始化其中的 PDO 对象

$db = "mysql:host=localhost;dbname=my_database";
$pdo = new PDO($db, 'dbname', 'dbpassword');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//some operations.. Works fine!

function sendMail($to)
    {
      $db = "mysql:host=localhost;dbname=my_database";
      $pdo = new PDO($db, 'dbname', 'dbpassword');
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      $qryString="SELECT Codice FROM users WHERE Mail=:mail";
      $qry = $pdo->prepare($qryString);
      $params = array("mail" => $to);
      $qry->execute($params); //won't work
    }

请注意,函数外对数据库的操作可以正常工作。

问题是代码既不能传递全局 $pdo 对象也不能工作。这是实际的代码

 $db = "mysql:host=localhost;dbname=my_database";
 $pdo = new PDO($db, 'dbname', 'dbpassword');
 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 sendMail($mail, $pdo)

function sendMail($to, PDO $pdo)
        {
          $qryString="SELECT Codice FROM users WHERE Mail=:mail";
          $qry = $pdo->prepare($qryString);
          $params = array("mail" => $to);
          $qry->execute($params); 
        }
4

2 回答 2

3

变量范围与数据库连接细节完全无关。
如果您有一个选择了数据库的连接,则如果您在函数中使用此连接,则将选择相同的数据库。

因此,这显然是一个过于本地化的问题,因为问题显然是类似拼写错误的 - 连接到错误的数据库、拼写错误的变量名称、数据库名称等。

不幸的是,普通的 PHP 用户对执行正确的、可重现的实验来证明他们的假设知之甚少。相反,他们通过间接后果猜测原因。

您只需要编写您告诉我们的代码,然后就可以看到数据库已被选中。然后转向寻找真正的原因。完整的错误报告 ( E_ALL) 通常有很大帮助。

于 2013-11-01T10:50:19.897 回答
0

将 PDO 对象传递给函数,因为 的范围在 .$pdo的范围之外sendMail()

function sendMail(PDO $pdo, $to) {
    $queryString = "SELECT Codice FROM users WHERE Mail=:mail";
    $statement = $pdo->prepare($queryString);
    $params = array("mail" => $to);
    $result = $statement->execute($params);
}

或者

function sendMail($to) {
    global $pdo;
    $queryString = "SELECT Codice FROM users WHERE Mail=:mail";
    $statement = $pdo->prepare($queryString);
    $params = array("mail" => $to);
    $result = $statement->execute($params);
}
于 2013-11-01T10:34:25.293 回答