注意:未定义的偏移量:0 in
Posted
技术标签:
【中文标题】注意:未定义的偏移量:0 in【英文标题】:Notice: Undefined offset: 0 in 【发布时间】:2011-09-26 19:59:29 【问题描述】:我收到这个 php 错误,这是什么意思?
Notice: Undefined offset: 0 in
C:\xampp\htdocs\mywebsite\reddit_vote_tut\src\votes.php on line 41
从此代码:
<?php
include("config.php");
function getAllVotes($id)
$votes = array();
$q = "SELECT * FROM entries WHERE id = $id";
$r = mysql_query($q);
if(mysql_num_rows($r)==1)//id found in the table
$row = mysql_fetch_assoc($r);
$votes[0] = $row['votes_up'];
$votes[1] = $row['votes_down'];
return $votes;
function getEffectiveVotes($id)
$votes = getAllVotes($id);
$effectiveVote = $votes[0] - $votes[1]; //ERROR THROWN HERE
return $effectiveVote;
$id = $_POST['id'];
$action = $_POST['action'];
//get the current votes
$cur_votes = getAllVotes($id);
//ok, now update the votes
if($action=='vote_up') //voting up
$votes_up = $cur_votes[0]+1; //AND ERROR THROWN HERE
$q = "UPDATE threads SET votes_up = $votes_up WHERE id = $id";
elseif($action=='vote_down')
$votes_down = $cur_votes[1]+1;
$q = "UPDATE threads SET votes_down = $votes_down WHERE id = $id";
$r = mysql_query($q);
if($r)
$effectiveVote = getEffectiveVotes($id);
echo $effectiveVote." votes";
elseif(!$r) //voting failed
echo "Failed!";
?>
【问题讨论】:
你的代码很危险!它可以用于sql注入! @Bernd Ott 那么我该如何排序呢? 使用允许查询参数的数据库层和/或使用 mysql_real_escape_string 参见php.net/manual/de/function.mysql-real-escape-string.php 还有一些不错的示例。 我想指出,mysqli_real_escape_string 仍然容易受到 SQL 注入的影响,在撰写本文时(2020 年)应该不鼓励这样做。准备好的语句是现在要走的路。 【参考方案1】:您正在请求 $votes
的键 0
处的值。它是一个不包含该键的数组。
数组$votes
没有设置,所以当PHP试图访问数组的键0
时,遇到[0]和[1]的未定义偏移并抛出错误。
如果你有一个数组:
$votes = array('1','2','3');
我们现在可以访问了:
$votes[0];
$votes[1];
$votes[2];
如果我们尝试访问:
$votes[3];
我们会得到错误“Notice: Undefined offset: 3”
【讨论】:
我的代码中没有'$new_array'。那我需要添加这个吗? 不,我用这个作为你的代码中导致问题的一个例子,我只是试图重新创建问题作为向你解释它的一种方式。您的问题是数组值: $votes 尚未定义。所以你得到一个错误(通知)你必须确保数组被正确填充,因为它似乎不是。 那我要定义什么,如何定义? 如果您查看您的函数“getAllVotes”,您会注意到只有当查询找到结果时才会填充数组,如果找不到结果则不会填充数组 ( $votes),所以我假设你得到这个结果是因为你的查询没有返回任何结果。 为什么访问$new_array[3]
的尝试说未定义的偏移量是0
,而不是3
?【参考方案2】:
首先,检查数组是否真的存在,你可以尝试类似
if (isset($votes))
// Do bad things to the votes array
【讨论】:
【参考方案3】:这个答案帮助了我https://***.com/a/18880670/1821607
粉碎的原因 - 未设置索引 0。简单的$array = $array + array(null)
成功了。或者您应该检查索引 0 上的数组元素是否通过isset($array[0])
设置。第二种变体对我来说是最好的方法。
【讨论】:
【参考方案4】:使用print_r($votes);
检查数组$votes
,你会看到0
不存在。它将返回 NULL 并抛出该错误。
【讨论】:
【参考方案5】:getAllVotes()
未返回索引为 0
或 1
的数组。通过在结果上调用 var_dump()
确保它返回您想要的数据。
【讨论】:
【参考方案6】:我也遇到过这种情况,解决方法很简单,不要在代码中硬编码数组索引位置。
代替
$data[0]['somekey']
do
foreach($data as $data_item)
echo $data_item['somekey'];
如果有一个或多个数组,您可以在循环内执行所需的操作,但如果它未定义,则不会带来错误。您还可以在此基础上添加其他检查。
如果您只想要第一个位置或其他内容,您还可以添加一个变量并在 for in 循环中递增它以限制您的循环。
【讨论】:
【参考方案7】:正如解释的那样,这是因为$cur_votes[0]
中没有数据,因此会引发错误。
为确保您的代码正常工作,在执行"$votes_up = $cur_votes[0]+1;"
之前回显$cur_votes[0]
值以查看是否存储了任何值。
当然,没有存储任何值。
【讨论】:
【参考方案8】:function getEffectiveVotes($id)
根据函数头,参数变量只有一个($id
)。
因此,在第 27 行,votes[]
数组未定义且超出范围。您需要添加另一个
函数头的参数值,以便函数getEffectiveVotes()
知道需要两个参数。我生疏了,但这样的事情会奏效。
function getEffectiveVotes($id, $votes)
我并不是说应该这样做,但您可能想研究 PHP 如何 传递它的数组并决定是否需要显式声明以通过引用传递它
function getEffectiveVotes($id &$votes) <---I forget, no time to look it up right now.
最后,使用两个参数调用函数getEffectiveVotes()
。
干杯。
【讨论】:
【参考方案9】:您可能已经知道这个错误。这是由于试图访问空数组或试图访问数组的空键的值。在我的项目中,我正在通过计算数组和显示结果来处理这个错误。
你可以这样做:
if(count($votes) == '0')
echo 'Sorry, no votes are available at the moment.';
else
//do the stuff with votes
count($votes)
计算 $votes
数组。如果它等于零(0)
,您可以显示您的自定义消息或重定向到某个页面,否则您可以使用$votes
做一些事情。这样就可以在PHP中去掉Notice: Undefined offset: 0
的通知了。
【讨论】:
【参考方案10】:如果省略括号,PHP 将默认分配键。
试试这个:
$votes = $row['votes_up'];
$votes = $row['votes_down'];
【讨论】:
【参考方案11】:在我的例子中,它是一个简单的类型
$_SESSION['role' == 'ge']
我错过了正确的右括号
$_SESSION['role'] == 'ge'
【讨论】:
【参考方案12】:如果您使用 dompdf/dompdf 并且在 vendor/dompdf/dompdf/src/Cellmap.php 中发生错误,那么 看起来我们在 update_row_group 方法中使用了错误的帧 ID。初步测试似乎证实了这一点。虽然这可能是因为这严格来说是一个分页表问题,而且我的测试台中没有太多文档有分页表。
您可以尝试将第 800 行更改为:
$r_rows = $this->_frames[$g_key]["rows"]; ($g_key 而不是 $r_key)
https://github.com/dompdf/dompdf/issues/1295
【讨论】:
【参考方案13】:改用mysql行
mysql_fetch_row($r)
同时考虑使用mysqli或PDO
?>
【讨论】:
【参考方案14】:尝试使用命令播种数据:php artisan db:seed
。
【讨论】:
【参考方案15】:它只是一个警告用途:
error_reporting(0);
它显示了我们何时不初始化数组并直接为索引赋值。
somefunction
$raja[0]="this";
$raja[1]="that";
改为:
somefunction
$raja=array(0=>'this',1='that');
//or
$raja=array("this","that");
它只是通知,不会产生任何输出错误或任何意外输出。
【讨论】:
这是一个“通知” 这只是一个糟糕的建议。sweep_under_rug(true);
以上是关于注意:未定义的偏移量:0 in的主要内容,如果未能解决你的问题,请参考以下文章
“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”使用 PHP
“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”使用 PHP
“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”使用 PHP
“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”使用 PHP