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

时间:2018-10-16 19:23:10

标签: php mysqli

我有一个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();
}

1 个答案:

答案 0 :(得分:0)

AllenJB:手动更改为password_verify()不仅更好,而且还修复了空的bind_param并执行问题。

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

在某种程度上无法使用password_hash。我不再绑定发布的密码,而是在PHP服务器端进行验证,现在我从数据库中获得了正确的结果。

(也感谢Sjon指导我完成调试过程。)