Php 关于非对象和未定义变量的注意事项
我试图通过在PHP中构建错误答案列表来检索每个问题的错误答案。例如,通过包含原始查询中的一行来计算错误答案,如下所示:Php 关于非对象和未定义变量的注意事项,php,mysqli,Php,Mysqli,我试图通过在PHP中构建错误答案列表来检索每个问题的错误答案。例如,通过包含原始查询中的一行来计算错误答案,如下所示: $query = "SELECT q.SessionId, s.SessionName, q.QuestionId, q.QuestionNo, an.Answer, an.AnswerId FROM Session s INNER JOIN Question q ON s.SessionId = q.SessionId JOIN Answ
$query = "SELECT q.SessionId, s.SessionName, q.QuestionId, q.QuestionNo, an.Answer, an.AnswerId
FROM Session s
INNER JOIN Question q ON s.SessionId = q.SessionId
JOIN Answer an ON q.QuestionId = an.QuestionId
WHERE s.SessionName = ?
ORDER BY q.QuestionId, an.Answer
";
// prepare query
$stmt=$mysqli->prepare($query);
// You only need to call bind_param once
$stmt->bind_param("s", $assessment);
// execute query
$stmt->execute();
$specialOptionTypes = array(
'Yes or No' => array( 'Y', 'N' ),
'True or False' => array( 'T', 'F' ),
);
// Do this for each row:
if ( array_key_exists( $row->OptionType, $specialOptionTypes ) ) {
$options = $specialOptionTypes[ $row->OptionType ];
} else if ( preg_match( '/^([A-Z])-([A-Z])$/', $row->OptionType, $match ) ) {
$options = range( $match[1], $match[2] );
} else {
// issue warning about unrecognized option type
$options = array();
}
$right = str_split( $row->Answer ); // or explode() on a delimiter, if any
$wrong = array_diff( $options, $right );
// Fetch the results into an array
// get result and assign variables (prefix with db)
$stmt->bind_result($dbSessionId, $dbSessionName, $dbQuestionId, $dbQuestionNo, $dbAnswer, $dbAnswerId);
while ($stmt->fetch()) {
$incorrect_ans[] = $wrong;
}
....
//table row
<td class="answertd" name="incorrectanswers[]"><?php
echo $incorrect_ans[$key];
?></td>
$query=“选择q.SessionId、s.SessionName、q.QuestionId、q.QuestionNo、an.AnswerId、an.AnswerId
来自会话s
s.SessionId=q.SessionId上的内部连接问题q
加入q.QuestionId=A.QuestionId上的答案
其中s.SessionName=?
按q.QuestionId排序,A.答案
";
//准备查询
$stmt=$mysqli->prepare($query);
//您只需要调用bind_param一次
$stmt->bind_参数(“s”,$assessment);
//执行查询
$stmt->execute();
$specialOptionTypes=数组(
'是或否'=>数组('Y','N'),
'True或False'=>数组('T','F'),
);
//对每行执行以下操作:
如果(数组\键\存在($row->OptionType,$specialOptionTypes)){
$options=$specialOptionTypes[$row->OptionType];
}如果(preg_match('/^([A-Z])-([A-Z])$/',$row->OptionType,$match)){
$options=范围($match[1],$match[2]);
}否则{
//发出有关无法识别的选项类型的警告
$options=array();
}
$right=str_split($row->Answer);//或在分隔符上分解(),如果有的话
$error=数组_diff($options,$right);
//将结果提取到数组中
//获取结果并分配变量(前缀为db)
$stmt->bind_result($dbSessionId、$dbSessionName、$dbQuestionId、$dbQuestionNo、$dbAnswer、$dbAnswerId);
而($stmt->fetch()){
$error_ans[]=$error;
}
....
//表行
但我遇到的问题是,我没有得到错误的答案,而是收到了几个错误:
第一个错误是任何$row
变量的错误,该变量显示在上面的代码中,其中说明:
注意:未定义变量:中的行。。。在线
注意:正在尝试获取。。。在线
第二个问题在上面的表行中,它显示的不是错误的答案,而是数组
我的问题是如何修复通知和数组,使其至少具有一个无错误的应用程序?如果您没有将
$row
初始化为If语句之外的内容,那么它是未定义的
这意味着
$row
不是一个对象,在某些情况下可能是NULL或false(找不到),因为它不可访问。超出范围啊,好的,mysqli-fetch_对象是否能够对这一个进行排序?我试图实现匹配此链接:但不确定为了能够检索错误答案,我需要做哪些更改。你对此有什么想法吗?很抱歉,我不明白你在问什么好的,我会作为一个单独的问题问。我需要更好地解释一下。谢谢你的帮助。