php中未定义的变量和致命错误

时间:2017-12-10 07:51:45

标签: php pdo

我正在尝试使用函数获取用户信息 - user_info .. 但我似乎无法访问connect.php中的pdo变量..

所以我有这些错误..

  

注意:未定义的变量:第33行的C:\ xampp \ htdocs \ assets \ function.php中的pdo

     

致命错误:在第33行的C:\ xampp \ htdocs \ assets \ function.php中调用null上的成员函数prepare()

connect.php

 <?php
$servername = "localhost";
$username = "root";
$password = "";
try {
//Creating connection for mysql
$pdo = new PDO("mysql:host=$servername;dbname=store", $username, $password);
// set the PDO error mode to exception
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>

function.php

function user_info($user, $field)
{

$query = $pdo->prepare("SELECT $field FROM susers WHERE id=:id");
$query->bindParam("id", $user_id, PDO::PARAM_STR);
$query->execute();
while ($row =  $query->fetch(PDO::FETCH_ASSOC)) {
     $info=$row[$field];
     return $info;
}
}

Display.php的

    ?php
// Start Session

include('int.php');

// check user login
if(empty($_SESSION['id']))
{
    header("Location: notlogged.php");
}

$user = $_SESSION['id']; // get user details
$name=user_info($user, 'fullname');


echo "$name";

?>

int.php

    <?php
session_start();
include('assets/function.php');
include('db/connect.php');
?>

4 个答案:

答案 0 :(得分:2)

这是范围的常见问题,$ pdo在全局范围内定义。您需要将其传递给您的方法以允许它使用它...

function user_info($user, $field)

...变为

function user_info($pdo, $user, $field)

并且被......打电话。

$name=user_info($pdo, $user, 'fullname');

您可以使用global $pdo;,但这可能导致各种问题并将变量传入其中被认为是更好的解决方案。

答案 1 :(得分:1)

在您的代码中存在范围问题。在这里学习Variable Scoping。函数内的代码具有局部范围。您的函数public static int biggest(int[][] grid, int big) { int total=0; for (int r = 0,int c = 0; r < grid.length && c < grid[r].length; r++,c++) { total+=grid[r][c]; } return total; } 无法找到$ pdo。为此,您需要在函数参数中传递user_info

$pdo

另一种解决方案是将function user_info($user, $field, $pdo) { $query = $pdo->prepare("SELECT $field FROM susers WHERE id=:id"); $query->bindParam("id", $user_id, PDO::PARAM_STR); $query->execute(); while ($row = $query->fetch(PDO::FETCH_ASSOC)) { $info=$row[$field]; return $info; } $name=user_info($user, 'fullname',$pdo); 设为$pdo

global
  

使用全局关键字

使$ pdo全局化

答案 2 :(得分:0)

在PHP中,默认情况下Global Scope不会像其他语言一样在函数范围内继承。由于您已在全局范围内定义$pdo,因此默认情况下将无法在函数内使用。

要使其在函数内可用,有两种方法可以在不改变函数签名的情况下完成。

1。使用global关键字(http://php.net/manual/en/language.variables.scope.php

function user_info($user, $field) {
  // After this declaration, Global $pdo will be scoped inside this function.
  global $pdo;
  $query = $pdo->prepare("SELECT $field FROM susers WHERE id=:id");
  ...

2。使用$GLOBALShttp://php.net/manual/en/reserved.variables.globals.php

function user_info($user, $field) {
  // With $GLOBALS, you can use any variable defined in global scope inside your function.
  $query = $GLOBALS['pdo']->prepare("SELECT $field FROM susers WHERE id=:id");
  ...
  

如果您准备更改功能签名(如果尚未在很多地方使用),您始终可以将全局范围变量作为函数的参数传递,如function user_info($pdo, $user, $field)

答案 3 :(得分:0)

请在user_info函数中传递$ pdo变量。