我有一个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: %s\n", $GLOBALS['mysqli']->connect_error);
exit();
}
答案 0 :(得分:0)
AllenJB:手动更改为password_verify()不仅更好,而且还修复了空的bind_param并执行问题。
$stmt->bind_param("ss", $_POST['name'], password_hash($_POST['password'], PASSWORD_DEFAULT));
在某种程度上无法使用password_hash。我不再绑定发布的密码,而是在PHP服务器端进行验证,现在我从数据库中获得了正确的结果。
(也感谢Sjon指导我完成调试过程。)