【问题标题】:ILLEGAL & UNINITIALIZED string offset error [duplicate]ILLEGAL & UNINITIALIZED 字符串偏移错误 [重复]
【发布时间】:2017-10-19 05:24:08
【问题描述】:

我在修复我的错误时遇到了麻烦,这些功能工作正常,但我需要摆脱错误

我有以下错误:

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

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

致命错误:第 19 行 C:\xampp\htdocs\checkout.php 中的布尔值调用成员函数 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(); 
?>

登录.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);
} 
?>

【问题讨论】:

  • 发布您的dbConfig.php
  • 完成.....已编辑
  • var_dump($query) 在此行之前 $custRow = $query-&gt;fetch_assoc(); 并粘贴结果
  • @BasheerAhmedKharoti dbConfig.php 的内容无关紧要。 $query is FALSE.
  • @axiac 我不知道$query-&gt;fetch_assoc() 的返回类型,并假设异常消息的布尔值,刚刚确认。 (Y)

标签: php warnings fatal-error


【解决方案1】:

第 15 行:

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

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

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

$sessData 是一个字符串(这就是错误所说的,login.php 的第 3 行证实了这一说法)。

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

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

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

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

字符串偏移量和您在login.php 中使用$sessData 的方式告诉$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 中的布尔值调用成员函数 fetch_assoc()

关于此错误的信息在 [so] 上出现了几十次 askedanswered。此处不再重复回答。

mysqli::query() 在查询有语法错误或引用数据库中不存在的对象时返回 FALSE。在这种情况下,查询以WHERE id= 结束,因为$_SESSION['sessCustomerID'] 为空,如上所述。

但是$_SESSION['sessCustomerID'] 在第一个页面加载时仍然是空的,即使你修复了$sessData 的初始化。除了使用prepared statements(详见链接的answer)之外,如果您事先知道不会得到任何结果,则不应向数据库发出查询(当$_SESSION['sessCustomerID'] 为空时会发生这种情况)。

【讨论】:

  • 我现在的问题是 Undefined index: userID on line15
  • 远离代码并制定计划。当用户第一次来到网站时,$sessData 是空的。这是特例,要特殊对待。
  • 我刚开始学习 php,很抱歉。它仍然让我感到困惑,我想知道我自己的代码中的确切答案,以便下次可以将其用作参考。
  • 官方PHP documentation是PHP问题的最佳答案来源。在Stack Overflow 上提问也有帮助,但很多时候你会得到意见,而不是事实。事实在文档中提供。此外,您在学习 PHP 的这一阶段可能遇到的 90% 的问题已经在 Stack Overflow 上得到解答。 Search 在询问之前为他们服务;这样可以节省时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2020-06-11
  • 2013-11-07
  • 2014-11-27
  • 1970-01-01
  • 2017-09-05
相关资源
最近更新 更多