2011-09-06 58 views
0

我的代码:我在做什么错了让这个致命的错误

<?php 

$conn = new MySQLi("localhost", "root", "", "barman"); 

function validate_details($user, $pass){ 

$sql = "SELECT * FROM users"; 
$result = $conn->query($sql); 

    if($user==$row->user && isset($user)){ 

     if($pass == $row->pass && isset($pass)){ 
      return true; 
     } 
    }else{ 
     return false; 
    } 


} 


?> 

错误:

致命错误:调用一个成员函数查询(c)中的非对象:\第8行(第8行是$ result = $ conn-> query($ sql); )

+2

函数在PHP中有自己的作用域。见http://php.net/manual/en/language.variables.scope.php –

回答

2

您试图访问已在全球范围内从一个函数中创建一个变量。

要么将​​$conn变量作为参数传递给函数(这是首选项),要么使用global keyword将它导入到函数的作用域中。

所以,你可以这样做:(者优先选项)

function validate_details ($conn, $user, $pass) { 
    // function code goes here 
} 

// Call the function like this 
$result = validate_details($conn, 'myuser', 'mypass'); 

...或...这(不太好)

function validate_details ($user, $pass) { 
    global $conn; 
    // function code goes here 
} 

有很多原因,更好地传递连接对象作为参数,但这里有一对夫妇:

  • 这意味着你可以使用你的函数在同一个脚本
  • 这意味着你可以很容易地回收功能,修改,在其它脚本更是一个连接
  • 如果在某些时候,你需要的$conn变量重命名全球范围内,你不必担心在函数变化是

我想这也是值得一提的$GLOBALS阵列 - 这是一个superglobal(即它可以在任何地方使用),但是实际上这与global关键字没有多大区别,因此应该避免出于同样的原因。

你可以使用这样的:

function validate_details ($user, $pass) { 
    // ... 
    $result = $GLOBALS['conn']->query($sql); 
    // ... 
} 
+0

尼斯彻底修订DaveRandom – menislici

+0

...我们的目标是取悦...和FYI我只是做了一些小的更正,可能已经有点混乱。 – DaveRandom

6

你不能在你的函数之外使用变量或对象,除了那些全球设置。

尝试使用

function validate_details($user, $pass){ 
    global $conn; 
    ...................... 
} 
0

使用global $conn。否则它将无法工作。 :)

相关问题