ILLEGAL& UNINITIALIZED字符串偏移错误

时间:2017-10-19 05:24:09

标签: php warnings fatal-error

我无法修复错误,功能正常但我需要摆脱错误

我有以下错误:

  

警告:第15行的C:\ xampp \ htdocs \ checkout.php中的非法字符串偏移'userID'

     

注意:未初始化的字符串偏移量:第15行的C:\ xampp \ htdocs \ checkout.php中为0

     

致命错误:在第19行的C:\ xampp \ htdocs \ checkout.php中调用boolean上的成员函数fetch_assoc()

并且我的代码是:

CHECKOUT.PHP

<?php
// include database configuration file
include 'dbConfig.php';
include 'login.php';
// initializ shopping cart class
include 'Cart.php';
$cart = new Cart;

// redirect to home if cart is empty
if($cart->total_items() <= 0){
header("Location: index.php");
}

// set customer ID in session
$_SESSION['sessCustomerID'] = $sessData['userID']; //this is the ID for the logged in user

// get customer details by session customer ID
$query = $db->query("SELECT * FROM users WHERE id =".$_SESSION['sessCustomerID']);
$custRow = $query->fetch_assoc(); 
?>

的login.php

<?php
 session_start();
$sessData = !empty($_SESSION['sessData'])?$_SESSION['sessData']:'';
if(!empty($sessData['status']['msg'])){
    $statusMsg = $sessData['status']['msg'];
    $statusMsgType = $sessData['status']['type'];
    unset($_SESSION['sessData']['status']);
}
?>
<div class="container">
    <?php
        if(!empty($sessData['userLoggedIn']) && !empty($sessData['userID'])){
        include 'user.php';
        $user = new User();
        $conditions['where'] = array(
            'id' => $sessData['userID'],
        );
        $conditions['return_type'] = 'single';
        $userData = $user->getRows($conditions);
?>

DBCONFIG.PHP

<?php
//DB details
$dbHost = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'dbblair';

//Create connection and select DB
$db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);

if ($db->connect_error) {
    die("Unable to connect database: " . $db->connect_error);
} 
?>

1 个答案:

答案 0 :(得分:2)

第15行:

$_SESSION['sessCustomerID'] = $sessData['userID'];

引用此行的两条错误消息都非常清楚。

  

警告:非法字符串偏移&#39; userID&#39;在第15行的C:\ xampp \ htdocs \ checkout.php

$sessData是一个字符串(这是错误所说的,login.php的第3行确认了这个陈述。)

可以使用square bracket syntax(类似于数组)访问单个字符串字符,但偏移量必须是整数。偏移量是代码中的一个字符串,这就是错误所说的(字符串不是偏移量的合法值)。

  

注意:未初始化的字符串偏移量:第15行的C:\ xampp \ htdocs \ checkout.php中为0

因为它需要偏移量的整数而你使用字符串,所以解释器converts the string to number和结果是0。消息说字符串中不存在偏移0(这是正确的,因为$ sessData是'')。因此,使用空字符串初始化$_SESSION['sessCustomerID']

对于PHP,上面的两条消息只是一个警告和通知(即脚本可以继续),但实际上它们会在您的代码中显示严重错误。

字符串偏移量以及$sessData中使用login.php的方式告诉$sessData必须始终是一个数组。它无法解释为什么你把它设置成一个空字符串。 login.php的第3行应为:

$sessData = !empty($_SESSION['sessData']) ? $_SESSION['sessData'] : array();

第18和19行:

$query = $db->query("SELECT * FROM users WHERE id =".$_SESSION['sessCustomerID']);
$custRow = $query->fetch_assoc(); 

错误:

  

致命错误:在第19行的C:\ xampp \ htdocs \ checkout.php中调用boolean上的成员函数fetch_assoc()

有关此错误的信息在[so]上有askedanswered十几次。我不会在这里重复这个答案。

当查询出现语法错误或引用数据库中不存在的对象时,

mysqli::query()返回 FALSE。在这种情况下,查询以WHERE id=结尾,因为$_SESSION['sessCustomerID']为空,如上所述。

但即使您修复了$_SESSION['sessCustomerID']的初始化,$sessData在第一页加载时仍然为空。除了使用prepared statements(有关详细信息,请参阅链接的answer)之外,如果事先知道您未获得任何结果,则不应向数据库发出查询(这发生在{{ 1}}是空的)。