Hinweis: Undefinierter Offset: 0 in

69

Ich erhalte diesen PHP-Fehler. Was bedeutet das?

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

Aus diesem Code:

<?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!"; 
} 
?>
louismoore18
quelle
12
Ihr Code ist gefährlich! es kann für SQL-Injektionen verwendet werden!
Bernd Ott
@Bernd Ott wie sortiere ich das dann?
Louismoore18
2
Verwenden Sie eine DB-Ebene mit zulässigen Abfrageparametern und / oder verwenden Sie mysql_real_escape_string. Siehe php.net/manual/de/function.mysql-real-escape-string.php. Es gibt auch einige nette Beispiele.
Bernd Ott
Ich möchte darauf hinweisen, dass mysqli_real_escape_string immer noch anfällig für SQL-Injektionen ist und zum Zeitpunkt des Schreibens (2020) nicht empfohlen werden sollte. Vorbereitete Aussagen sind jetzt der richtige Weg.
Ich versuche es so sehr, aber ich weine stärker

Antworten:

90

Sie fragen nach dem Wert bei Schlüssel 0von$votes . Es ist ein Array, das diesen Schlüssel nicht enthält.

Das Array $votesist nicht festgelegt. Wenn PHP versucht, auf den Schlüssel 0des Arrays zuzugreifen , stößt es auf einen undefinierten Offset für [0] und [1] und löst den Fehler aus.

Wenn Sie ein Array haben:

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

Wir können jetzt zugreifen auf:

$votes[0];
$votes[1];
$votes[2];

Wenn wir versuchen, darauf zuzugreifen:

$votes[3];

Wir erhalten den Fehler "Hinweis: Undefinierter Offset: 3"

YonoRan
quelle
Ich habe kein '$ new_array' im Code. Muss ich das dann hinzufügen?
Louismoore18
5
Nein, ich habe dies als Beispiel dafür verwendet, was das Problem in Ihrem Code verursacht. Ich habe nur versucht, das Problem neu zu erstellen, um es Ihnen zu erklären. Ihr Problem ist, dass die Array-Werte: $ Stimmen nicht definiert wurden. Wenn Sie eine Fehlermeldung erhalten (Hinweis), müssen Sie sicherstellen, dass das Array ordnungsgemäß gefüllt wird, da dies nicht der Fall zu sein scheint.
YonoRan
Was definiere ich dann und wie definiere ich?
Louismoore18
2
Wenn Sie sich Ihre Funktion "getAllVotes" ansehen, werden Sie feststellen, dass nur wenn die Abfrage ein Ergebnis findet, das Array gefüllt wird. Wenn sie kein Ergebnis findet, wird das Array nicht gefüllt ($ voids) Angenommen, Sie erhalten dieses Ergebnis, weil Ihre Abfrage keine Ergebnisse zurückgibt.
YonoRan
Warum sagt ein Zugriffsversuch $new_array[3], dass der undefinierte Offset 0anstelle von ist 3?
Brian Kendig
11

Überprüfen Sie zunächst, ob das Array tatsächlich vorhanden ist. Versuchen Sie es mit etwas wie

if (isset($votes)) {
   // Do bad things to the votes array
}
Agg-rey Muhebwa
quelle
9

Diese Antwort hat mir geholfen, https://stackoverflow.com/a/18880670/1821607 Der Grund für Crush - Index 0 wurde nicht festgelegt. Einfach $array = $array + array(null)hat es geschafft. Oder Sie sollten überprüfen, ob das Array-Element auf Index 0 über gesetzt ist isset($array[0]). Die zweite Variante ist für mich der beste Ansatz.

Dmitrii Malyshev
quelle
7

Verwenden Sie print_r($votes);diese Option, um das Array zu überprüfen $votes. Sie werden feststellen, dass der Schlüssel 0dort nicht vorhanden ist. Es wird NULL zurückgeben und diesen Fehler auslösen.

Giulio Prisco
quelle
5

getAllVotes()gibt kein Array mit den Indizes 0oder zurück 1. Stellen Sie sicher, dass die gewünschten Daten zurückgegeben werden, indem Sie var_dump()das Ergebnis aufrufen .

Tim Cooper
quelle
2

Ich bin auch darauf gestoßen, und die Lösung ist einfach. Codieren Sie die Array-Indexposition in Ihrem Code nicht fest.
Anstatt zu $data[0]['somekey']tun foreach($data as $data_item) { echo $data_item['somekey']; }
Wenn es ein Array oder mehr gibt, können Sie die gewünschte Aktion innerhalb der Schleife ausführen. Wenn diese jedoch nicht definiert ist, wird kein Fehler angezeigt. Darüber hinaus können Sie weitere Prüfungen hinzufügen. Sie können auch eine Variable hinzufügen und in einer for-in-Schleife erhöhen, um die Schleife zu begrenzen, wenn Sie nur die ersten Positionen oder etwas anderes möchten.

Mihai
quelle
2

Wie bereits erläutert, geschieht dies, weil keine Daten im enthalten sind $cur_votes[0]und daher ein Fehler ausgegeben wird.

Um sicherzustellen, dass Ihr Code einwandfrei funktioniert, bevor Sie das "$votes_up = $cur_votes[0]+1;"Echo ausführen$cur_votes[0] Wert, ob ein Wert gespeichert ist oder nicht.

Sicherlich ist kein Wert gespeichert.

Espanta
quelle
1
function getEffectiveVotes($id) 

Entsprechend dem Funktionsheader gibt es nur eine Parametervariable ( $id). Somit ist in Zeile 27 das votes[]Array undefiniert und außerhalb des Gültigkeitsbereichs. Sie müssen dem Funktionsheader einen weiteren Parameterwert hinzufügen, damit die Funktion getEffectiveVotes()zwei Parameter erwartet. Ich bin rostig, aber so etwas würde funktionieren.

function getEffectiveVotes($id, $votes)

Ich sage nicht, dass dies so gemacht werden sollte, aber Sie möchten vielleicht untersuchen, wie PHP seine Arrays übergibt, und entscheiden, ob Sie explizit angeben müssen, um es als Referenz zu übergeben

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

Zuletzt rufen Sie die Funktion getEffectiveVotes()mit beiden Argumenten auf, wo immer sie aufgerufen werden soll.

Prost.

Anthony Rutledge
quelle
1

Wie Sie vielleicht schon über den Fehler gewusst haben. Dies ist darauf zurückzuführen, dass versucht wird, auf das leere Array oder auf den Wert des leeren Schlüssels des Arrays zuzugreifen. In meinem Projekt beschäftige ich mich mit diesem Fehler, indem ich das Array zähle und das Ergebnis anzeige.

Sie können es so machen:

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

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

count($votes)zählt das $votesArray. Wenn es gleich Null ist (0), können Sie Ihre benutzerdefinierte Nachricht anzeigen oder auf eine bestimmte Seite umleiten, auf der Sie andere Aufgaben ausführen können $votes. Auf diese Weise können Sie den Notice: Undefined offset: 0Hinweis in PHP entfernen .

Vijayrana
quelle
0

Wenn Sie die Klammern weglassen, weist PHP die Schlüssel standardmäßig zu.

Versuche dies:

$votes = $row['votes_up']; 
$votes = $row['votes_down']; 
David
quelle
0

In meinem Fall war es ein einfacher Typ

$_SESSION['role' == 'ge']

Mir fehlte die richtige Verschlussklammer

$_SESSION['role'] == 'ge'
Hammad Khan
quelle
0

Wenn Sie dompdf / dompdf verwenden und ein Fehler in der Datei vendor / dompdf / dompdf / src / Cellmap.php auftritt, verwenden wir anscheinend die falsche Frame-ID in der Methode update_row_group. Erste Tests scheinen dies zu bestätigen. Dies kann jedoch daran liegen, dass es sich ausschließlich um ein Problem mit ausgelagerten Tischen handelt und nicht zu viele Dokumente in meinem Prüfstand ausgelagerte Tische haben.

Können Sie versuchen, Zeile 800 in zu ändern:

$ r_rows = $ this -> _ frame [$ g_key] ["Zeilen"];
($ g_key statt $ r_key)

https://github.com/dompdf/dompdf/issues/1295

Madhavi Khatal
quelle
0

Verwenden Sie stattdessen die MySQL-Zeile

mysql_fetch_row ($ r)

In der Zwischenzeit sollten Sie mysqli oder PDO verwenden

?>

Alemoh Rapheal Baja
quelle
-2

Es ist nur eine Warnung:

error_reporting(0);

Es wird angezeigt, wenn wir das Array nicht initialisieren und den Indizes keinen direkten Wert zuweisen.

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

stattdessen :

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

Es ist nur eine Benachrichtigung, keine Ausgabefehler oder unerwartete Ausgabe zu generieren.

Teerath Kumar
quelle
Es ist eine "Nachricht"
Rocco
Dies ist einfach ein schlechter Rat.
Faintsignal