Mysqli 语句执行在 PHP 中不起作用



我有一个prepare((函数,它不起作用。(以防标题中不清楚。

我将我的 mysqli 连接放入一个$GLOBAL条目中,因为我不想到处声明它。有一些问题,如果没有在类中声明,我就不能在类中使用它。

include_once '../lib/init.php';
ob_start();
var_dump($GLOBALS['mysqli']);
print '<br />';
print $GLOBALS['mysqli']->server_info;
print '<br />';

我在页面开头使用这些,它们确实返回了似乎有效的连接。(??)

object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.6.29" ["server_version"]=> int(50629) ["stat"]=> string(153) "Uptime: 7820870 Threads: 1 Questions: 484247043 Slow queries: 14126 Opens: 837433 Flush tables: 1 Open tables: 2000 Queries per second avg: 61.917" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(76093624) ["warning_count"]=> int(0) }
5.6.29

如您所见,将返回对象,并响应属性和方法调用。但是,当我尝试准备声明时:

$stmt = $GLOBALS['mysqli']->prepare("SELECT 
".$GLOBALS['user_tbl']."_id 
FROM 
".$GLOBALS['user_tbl']." 
WHERE 
".$GLOBALS['user_tbl']."_name = ? 
AND 
".$GLOBALS['user_tbl']."_password = ?");
print $stmt->error;
var_dump($stmt);

似乎它确实返回了一个语句,甚至更好,没有错误。但是,除了不返回错误之外,它什么也不做:

object(mysqli_stmt)#2 (10) { ["affected_rows"]=> int(0) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(2) ["field_count"]=> int(1) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) } object(mysqli_stmt)#2 (10) { ["affected_rows"]=> int(0) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(2) ["field_count"]=> int(1) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) }

当我使用时,会返回相同的行:

$stmt->bind_param("ss", $_POST['name'], password_hash($_POST['password'], PASSWORD_DEFAULT));
var_dump($stmt);
$stmt->execute();
var_dump($stmt);

然而,该语句仍然是空的,无法从中检索任何结果。我已经检查了$GLOBALS数组,它确实包含我尝试使用的所有必要变量,但仍然无济于事。:(

空结果:

$result = $stmt->get_result();
var_dump($result);
$row = $result->fetch_array(MYSQLI_ASSOC);
var_dump($row);
print '<br />userid'.$row[$GLOBALS['user_tbl'].'_id'].'<br />';

这就是我在 init.php 中声明连接的方式,以防需要:

$GLOBALS['mysqli'] = new mysqli("localhost", "name", "password", "databasename");
// check connection
if ($GLOBALS['mysqli']->connect_errno) {
printf("Connect failed: %sn", $GLOBALS['mysqli']->connect_error);
exit();
}

AllenJB:直接更改为 password_verify(( 不仅更好,而且修复了空bind_param和执行问题。

$stmt->bind_param("ss", $_POST['name'], password_hash($_POST['password'], PASSWORD_DEFAULT));

在这里使用password_hash不知何故不起作用。我不再绑定发布的密码,而是在 PHP 服务器端进行验证,现在我从数据库中获得了正确的结果。

(也感谢 Sjon 也通过我完成调试过程。

最新更新