// Other variables
$MAX_FILENAME_LENGTH = 260;
$file_name = $_FILES[$upload_name]['name'];
//echo "testing-".$file_name."<br>";
//$file_name = strtolower($file_name);
$file_extension = end(explode('.', $file_name)); //ERROR ON THIS LINE
$uploadErrors = array(
0=>'There is no error, the file uploaded with success',
1=>'The uploaded file exceeds the upload max filesize allowed.',
2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
3=>'The uploaded file was only partially uploaded',
4=>'No file was uploaded',
6=>'Missing a temporary folder'
);
Irgendwelche Ideen? Nach 2 Tagen noch stecken.
Antworten:
Weisen Sie das Ergebnis
explode
einer Variablen zu und übergeben Sie diese Variable anend
:Das Problem ist, dass
end
eine Referenz erforderlich ist, da dadurch die interne Darstellung des Arrays geändert wird (dh der aktuelle Elementzeiger erstellt wird) auf das letzte Element).Das Ergebnis von
explode('.', $file_name)
kann nicht in eine Referenz umgewandelt werden. Dies ist eine Einschränkung in der PHP-Sprache, die wahrscheinlich aus Gründen der Einfachheit besteht.quelle
error_reporting
. Ist das sicher?error_reporting
. Es ist nicht sicher, Fehler blind zu ignorieren. Das Ausschaltenerror_reporting
ist ein wichtiger Schritt, um Fehler blind zu ignorieren. Deaktivieren Siedisplay_errors
stattdessen in der Produktionsumgebung und schreiben Sie Fehler in eine Protokolldatei.Php 7 kompatibel ordnungsgemäße Verwendung:
quelle
@
Präfix?Alle anderen haben Ihnen bereits den Grund angegeben, warum Sie einen Fehler erhalten. Hier ist jedoch der beste Weg, um das zu tun, was Sie tun möchten:
$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
quelle
Speichern Sie das Array von explode () in einer Variablen und rufen Sie dann end () für diese Variable auf:
Übrigens: Ich benutze diesen Code, um die Dateierweiterung zu erhalten:
wo
strrchr
extrahiert die Zeichenfolge nach dem letzten.
undsubstr
schneidet die.
quelle
Versuche dies:
Der Grund ist, dass das Argument für
end
als Referenz übergeben wird, daend
das Array geändert wird, indem der interne Zeiger auf das letzte Element verschoben wird. Wenn Sie keine Variable übergeben, gibt es nichts, auf das ein Verweis verweisen könnte.end
Weitere Informationen finden Sie im PHP-Handbuch.quelle
PHP beschwert sich, weil es
end()
einen Verweis auf etwas erwartet, das es ändern möchte (was nur eine Variable sein kann). Sie übergeben das Ergebnis jedochexplode()
direkt an,end()
ohne es zuerst in einer Variablen zu speichern. Im Moment alsexplode()
in dem Ihr Wert zurückgegeben wird, existiert er nur im Speicher und keine Variable zeigt darauf. Sie können keinen Verweis auf etwas (oder auf etwas Unbekanntes im Speicher) erstellen, das nicht vorhanden ist.Oder mit anderen Worten: PHP weiß nicht, ob der Wert, den Sie ihm geben, der direkte Wert oder nur ein Zeiger auf den Wert ist (ein Zeiger ist auch eine Variable (Ganzzahl), die den Offset des Speichers speichert, in dem sich der tatsächliche Wert befindet wohnt). PHP erwartet hier also immer einen Zeiger (Referenz).
Da dies in PHP 7 immer noch nur ein Hinweis ist (nicht einmal veraltet), können Sie Benachrichtigungen sicher ignorieren und den Ignorieroperator verwenden, anstatt die Fehlerberichterstattung für Benachrichtigungen vollständig zu deaktivieren:
quelle
explode
in einer temporären Variablen zu speichern , wie andere hier geschrieben haben. Aber nochmal: Dies ist kein Fehler, daher ist es in Ordnung, diesen Operator zu verwenden. PHP ist im Allgemeinen schlecht in der Fehlerbehandlung. Daher würde ich vorschlagen,set_error_handler
undset_exception_handler
zur Fehlerbehandlung und als sauberste Lösung zu verwenden.So wie Sie das Array nicht sofort indizieren können, können Sie auch nicht end aufrufen. Weisen Sie es zuerst einer Variablen zu und rufen Sie dann end auf.
quelle
end(...[explode('.', $file_name)])
hat seit PHP 5.6 funktioniert. Dies ist im RFC dokumentiert, jedoch nicht in den PHP-Dokumenten selbst.quelle
Da es seit über 10 Jahren eine Flagge hisst, aber einwandfrei funktioniert und den erwarteten Wert zurückgibt, ist ein kleiner stfu-Operator die beste schlechte Praxis, die Sie alle suchen:
quelle
PHP offizielles Handbuch: end ()
Parameter
Das Array. Dieses Array wird als Referenz übergeben, da es von der Funktion geändert wird. Dies bedeutet, dass Sie eine echte Variable übergeben müssen und keine Funktion, die ein Array zurückgibt, da nur tatsächliche Variablen als Referenz übergeben werden dürfen.
quelle
Zuerst müssen Sie den Wert in einer Variablen wie dieser speichern
Dann können Sie die End-Funktion verwenden, um den letzten Index aus einem Array wie diesem abzurufen
Ich hoffe es wird für dich funktionieren.
quelle
quelle