我无法修复错误,功能正常但我需要摆脱错误
我有以下错误:
警告:第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);
}
?>
答案 0 :(得分:2)
$_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();
$query = $db->query("SELECT * FROM users WHERE id =".$_SESSION['sessCustomerID']);
$custRow = $query->fetch_assoc();
错误:
致命错误:在第19行的C:\ xampp \ htdocs \ checkout.php中调用boolean上的成员函数fetch_assoc()
有关此错误的信息在[so]上有asked和answered十几次。我不会在这里重复这个答案。
当查询出现语法错误或引用数据库中不存在的对象时, mysqli::query()
返回
FALSE
。在这种情况下,查询以WHERE id=
结尾,因为$_SESSION['sessCustomerID']
为空,如上所述。
但即使您修复了$_SESSION['sessCustomerID']
的初始化,$sessData
在第一页加载时仍然为空。除了使用prepared statements(有关详细信息,请参阅链接的answer)之外,如果事先知道您未获得任何结果,则不应向数据库发出查询(这发生在{{ 1}}是空的)。