2011-07-01 26 views
34

Tôi nhận được lỗi PHP này, có nghĩa là gì?Thông báo: Không xác định offset: 0 trong

Notice: Undefined offset: 0 in 
C:\xampp\htdocs\mywebsite\reddit_vote_tut\src\votes.php on line 41 

Từ mã này:

<?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!"; 
} 
?> 
+9

mã của bạn nguy hiểm! nó có thể được sử dụng cho tiêm sql! –

+0

@Bernd Ott làm thế nào để tôi sắp xếp này sau đó? – louismoore18

+2

sử dụng lớp db cho phép tham số truy vấn và/hoặc sử dụng mysql_real_escape_string xem http://php.net/manual/de/function.mysql-real-escape-string.php cũng có một số mẫu đẹp. –

Trả lời

2

getAllVotes() không được trả lại một mảng với chỉ số 0 hoặc 1. Đảm bảo rằng nó trả về dữ liệu bạn muốn bằng cách gọi var_dump() trên kết quả.

52

Bạn đang yêu cầu giá trị tại số 0 của $votes. Nó là một mảng không chứa khóa đó.

Mảng $votes không được đặt, vì vậy khi PHP đang cố gắng truy cập khóa 0 của mảng, nó gặp phải chênh lệch không xác định cho [0] và [1] và ném lỗi.

Nếu bạn có một mảng:

$new_array = array('1','2','3'); 

Chúng tôi bây giờ có thể truy cập vào:

$new_array[0]; 
$new_array[1]; 
$new_array[2]; 

Nếu chúng ta cố gắng và truy cập:

$new_array[3]; 

Chúng tôi sẽ nhận được lỗi "Thông báo: Giá trị không được xác định: 3 "

+0

Tôi không có '$ new_array' trong mã. Tôi có cần thêm phần này không? – louismoore18

+4

Không, tôi đã sử dụng điều này làm ví dụ về những gì gây ra sự cố trong mã của bạn, tôi chỉ đang cố tạo lại vấn đề như một cách giải thích cho bạn. vấn đề của bạn là các giá trị mảng: $ vote chưa được xác định. Vì vậy, bạn nhận được một lỗi (Thông báo), bạn phải chắc chắn rằng các mảng đang được dân cư đúng cách, gây ra nó không có vẻ được. – YonoRan

+0

Tôi định nghĩa gì sau đó và làm cách nào để xác định? – louismoore18

4

Sử dụng print_r($votes); để kiểm tra mảng $votes, bạn sẽ thấy rằng khóa 0 không tồn tại ở đó. Nó sẽ trả về NULL và ném lỗi đó.

1

Như đã giải thích điều này xảy ra vì không có dữ liệu trong $ cur_votes [0] và do đó nó phát ra lỗi. Để đảm bảo mã của bạn hoạt động tốt, trước khi thực hiện "$ votes_up = $ cur_votes [0] +1;" echo giá trị $ cur_votes [0] để xem liệu có bất kỳ giá trị nào được lưu trữ hay không. Chắc chắn, không có giá trị được lưu trữ.

1
function getEffectiveVotes($id) 

Theo tiêu đề hàm, chỉ có một biến thông số ($id). Vì vậy, trên dòng 27, mảng votes[] không được xác định và nằm ngoài phạm vi. Bạn cần phải thêm một giá trị tham số khác vào tiêu đề hàm để hàm getEffectiveVotes() biết được hai tham số. Tôi đã gỉ, nhưng một cái gì đó như thế này sẽ làm việc.

function getEffectiveVotes($id, $votes) 

Tôi không nói rằng đây là làm thế nào nó nên được thực hiện, nhưng bạn có thể muốn nghiên cứu cách PHP đi mảng của mình và quyết định xem bạn cần phải nêu rõ ràng để vượt qua nó bằng cách tham khảo

function getEffectiveVotes($id &$votes) <---I forget, no time to look it up right now. 

Cuối cùng, chức năng gọi getEffectiveVotes() với cả hai đối số ở bất cứ nơi nào nó được cho là sẽ được gọi.

Chúc mừng.

2

đầu tiên, kiểm tra xem mảng thực sự tồn tại, bạn có thể thử một cái gì đó giống như

if (isset($$votes)) { 
    // Do bad things to the votes array 
} 
-1

của nó chỉ là một sử dụng cảnh báo:

error_reporting(0); 

nó cho thấy khi chúng ta không khởi tạo mảng và giá trị ấn định trực tiếp để lập chỉ mục.

somefunction{ 
$raja[0]="this"; 
$raja[1]="that"; 
} 

thay vì:

somefunction{ 
$raja=array(0=>'this',1='that'); 
//or 
$raja=array("this","that"); 
} 

nó chỉ thông báo, không tạo ra bất kỳ lỗi sản lượng hoặc bất kỳ đầu ra bất ngờ.

+0

........ Thật sao? – developerbmw

+0

đó là "Thông báo" – Rocco

0

Nếu bạn bỏ qua các dấu ngoặc thì PHP sẽ gán các khóa theo mặc định.

Hãy thử điều này:

$votes = $row['votes_up']; 
$votes = $row['votes_down']; 
2

Câu trả lời này đã giúp tôi https://stackoverflow.com/a/18880670/1821607 Lý do của lòng - chỉ số 0 chưa được đặt. Đơn giản $array = $array + array(null) đã thực hiện thủ thuật. Hoặc bạn nên kiểm tra xem phần tử mảng trên chỉ mục 0 có được đặt qua isset($array[0]) hay không. Biến thể thứ hai là phương pháp tốt nhất cho tôi.

0

Như bạn có thể đã biết về lỗi. Điều này là do cố gắng truy cập vào mảng trống hoặc cố gắng truy cập vào giá trị của khóa trống của mảng. Trong dự án của tôi, tôi đang xử lý lỗi này với việc đếm mảng và hiển thị kết quả.

Bạn có thể làm điều đó như thế này:

if(count($votes) == '0'){ 

    echo 'Sorry, no votes are available at the moment.'; 
} 
else{ 
    //do the stuff with votes 
} 

count($votes) đếm mảng $votes. Nếu số này bằng, bạn có thể hiển thị thông báo tùy chỉnh hoặc chuyển hướng đến trang nhất định mà bạn có thể thực hiện với $votes. Bằng cách này, bạn có thể xóa Notice: Undefined offset: 0 trong thông báo bằng PHP.

Các vấn đề liên quan