sizeof
Deze regel geeft een waarschuwing in mijn code. (Warning = sizeof(): Parameter must be an array or an object that implements Countable in)
Quote:
for($i=0; $i<sizeof($gpx_files); $i++) {
HTML_gpx::viewBatchImportTableRow($i+1, $gpx_files[$i]);
HTML_gpx::viewBatchImportTableRow($i+1, $gpx_files[$i]);
Enig zoekwerk doet mij vermoeden dat er "is_array" voor moet komen, maar hoe precies snap ik niet.
Jan
Het is dus geen array/object.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// batchimport GPX bestand //
function batchimportGPX() {
global $DEBUG, $cfg;
HTML::heading(_MENU_GPX_BATCH_IMPORT, 3);
if(!$cfg['public_host'] || check_password($cfg['admin_password'])) {
echo "<script src='./libraries/import.js'></script>\n";
// set current upload dir and scan it for gpx files
$dir = GPX_UPLOAD_DIR;
$gpx_files = scan_dir_f($dir, 0, 'FILETYPE_FILE', 'GPX');
HTML::message_r(_TRC_BATCH_IMPORTING_DIR, $dir);
HTML::message(_TRC_CHOOSE_FILES_FOR_BATCH_IMPORTING);
if($DEBUG) print_r($gpx_files);
HTML_gpx::viewBatchImportTableHeader();
for($i=0; $i<sizeof($gpx_files); $i++) {
HTML_gpx::viewBatchImportTableRow($i+1, $gpx_files[$i]);
}
HTML_gpx::viewBatchImportTableFooter($dir);
HTML_gpx::viewImportProgress();
}else {
HTML::message(_NOT_AUTH ." ". _DO_LOGIN);
}
}
function batchimportGPX() {
global $DEBUG, $cfg;
HTML::heading(_MENU_GPX_BATCH_IMPORT, 3);
if(!$cfg['public_host'] || check_password($cfg['admin_password'])) {
echo "<script src='./libraries/import.js'></script>\n";
// set current upload dir and scan it for gpx files
$dir = GPX_UPLOAD_DIR;
$gpx_files = scan_dir_f($dir, 0, 'FILETYPE_FILE', 'GPX');
HTML::message_r(_TRC_BATCH_IMPORTING_DIR, $dir);
HTML::message(_TRC_CHOOSE_FILES_FOR_BATCH_IMPORTING);
if($DEBUG) print_r($gpx_files);
HTML_gpx::viewBatchImportTableHeader();
for($i=0; $i<sizeof($gpx_files); $i++) {
HTML_gpx::viewBatchImportTableRow($i+1, $gpx_files[$i]);
}
HTML_gpx::viewBatchImportTableFooter($dir);
HTML_gpx::viewImportProgress();
}else {
HTML::message(_NOT_AUTH ." ". _DO_LOGIN);
}
}
Gewijzigd op 22/10/2020 16:12:28 door - Ariën -
Debug staat aan (volgens mij toch) en geeft deze melding:
Quote:
Warning: sizeof(): Parameter must be an array or an object that implements Countable in /home/u57968p54877/domains/jan-karina.es/public_html/wandelingen/phpmygpx/gpx.php on line 451
Bedankt trouwens vooor je snelle reacties.
sizeof() is een alias voor de functie count() en moet een variabele krijgen waar iets achter zit dat de Countable interface heeft geïmplementeerd. Arrays hebben dat standaard, maar het mag ook een object van eigen class zijn.
PHP klaagt dat $gpx_files niet te tellen is via de Countable interface, het is blijkbaar geen array en verwijst ook niet naar iets anders dat de Countable interface wel heeft. Je zult moeten achterhalen wat er dan wel in $gpx_files zit, bijvoorbeeld met var_dump():
Je moet daarna achterhalen hoe het komt dat $gpx_files niet voldoet aan het criterium van sizeof(), en besluiten hoe je dat op wilt lossen in de code die voorafgaat aan de for-lus.
PHP klaagt dat $gpx_files niet te tellen is via de Countable interface, het is blijkbaar geen array en verwijst ook niet naar iets anders dat de Countable interface wel heeft. Je zult moeten achterhalen wat er dan wel in $gpx_files zit, bijvoorbeeld met var_dump():
Je moet daarna achterhalen hoe het komt dat $gpx_files niet voldoet aan het criterium van sizeof(), en besluiten hoe je dat op wilt lossen in de code die voorafgaat aan de for-lus.
Bedankt voor je antwoord maar daar moet ik eens heel lang op stureren hoor :-)
De vraag is: als het geen array of object is, wat is het wel?
Quote:
Die tag is er wel. Zie ook de Veelgestelde Vragen. :-)
Het zou wel gemakkelijker zijn als je gewoon in de editorbalk staat ;-)
Toevoeging op 22/10/2020 12:54:50:
- Ariën - op 22/10/2020 12:42:47:
De vraag is: als het geen array of object is, wat is het wel?
Mijn inziens is het de inhoud van een formulier, verder zou ik het echt niet weten.
Als je [code] en [/code]-tags toevoegt heb je ook lijnnummer erbij.
En ja, de knop ontbreekt. Er komt wel een keer een moment dat die wordt toegevoegd bij onderhoud aan de site.
Gewijzigd op 22/10/2020 13:01:56 door - Ariën -
Ik ga het eens bekijken op mijn gemak, bedankt in ieder geval.
scan_dir() is een standaard php-functie. Zo te zien heb jij een eigen variant hierop gemaakt scan_dir_f()
En die geeft iets anders terug dan een array, wat scan_dir() wel doet.
Wat geeft jouw functie wel terug? En is dat onder alle omstandigheden zo?
Bijvoorbeeld: als er geen files gevonden worden: wordt dan een leeg array teruggegeven? of komt er NULL of FALSE terug?
Ik zoek alleen hulp omdat het gevonden oude script een aantal fouten gaf, de meeste heb ik zelf gevonden maar dit is de laatste waar ik geen oplossing voor vindt.
Alleen al antwoord geven op jullie vragen is al erg moeilijk voor mij ;-)
Gelukkig werkt het hele programma wel, dus haast is er niet bij.
Maar je moet even zoeken in je codebase naar de function: scan_dir_f
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// self-made function like 'scandir()' from PHP5
function scan_dir($dir, $sorting_order, $type) {
$filelist = scan_dir_f($dir, $sorting_order, $type, 0);
return $filelist;
}
// self-made extended scandir function with filetype filter
function scan_dir_f($dir, $sorting_order, $type, $filter) {
// definitions of constants for 'type'
$FILETYPE_ALL = 0;
$FILETYPE_DIR = 1;
$FILETYPE_FILE = 2;
if(!is_int($type)) $type = $$type;
clearstatcache();
$dirhandle = opendir($dir);
while (false !== ($file = readdir($dirhandle))) {
if($file != "." && $file != "..") {
switch($type) {
case 0:
$files[] = $file;
break;
case 1:
if(is_dir($dir.$file)) $files[] = $file;
break;
case 2:
if(is_file($dir.$file)) {
$ext = substr($file, strrpos($file, '.')+1);
if(!$filter || strtolower($ext) == strtolower($filter))
$files[] = $file;
}
break;
}
}
}
closedir($dirhandle);
if(isset($files)) { # prevents php warning
if($sorting_order == 1) rsort($files);
else sort($files);
}
return $files;
}
function scan_dir($dir, $sorting_order, $type) {
$filelist = scan_dir_f($dir, $sorting_order, $type, 0);
return $filelist;
}
// self-made extended scandir function with filetype filter
function scan_dir_f($dir, $sorting_order, $type, $filter) {
// definitions of constants for 'type'
$FILETYPE_ALL = 0;
$FILETYPE_DIR = 1;
$FILETYPE_FILE = 2;
if(!is_int($type)) $type = $$type;
clearstatcache();
$dirhandle = opendir($dir);
while (false !== ($file = readdir($dirhandle))) {
if($file != "." && $file != "..") {
switch($type) {
case 0:
$files[] = $file;
break;
case 1:
if(is_dir($dir.$file)) $files[] = $file;
break;
case 2:
if(is_file($dir.$file)) {
$ext = substr($file, strrpos($file, '.')+1);
if(!$filter || strtolower($ext) == strtolower($filter))
$files[] = $file;
}
break;
}
}
}
closedir($dirhandle);
if(isset($files)) { # prevents php warning
if($sorting_order == 1) rsort($files);
else sort($files);
}
return $files;
}
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// self-made extended scandir function with filetype filter
function scan_dir_f($dir, $sorting_order, $type, $filter) {
$files = []; <= deze regel toevoegen
// definitions of constants for 'type'
$FILETYPE_ALL = 0;
?>
// self-made extended scandir function with filetype filter
function scan_dir_f($dir, $sorting_order, $type, $filter) {
$files = []; <= deze regel toevoegen
// definitions of constants for 'type'
$FILETYPE_ALL = 0;
?>
Gewijzigd op 22/10/2020 17:15:43 door Ozzie PHP
Ontzettend bedankt Ozzie, dat was inderdaad de oplossing.
Geen dank hoor. Succes met je project.
Komt het misschien omdat er lege directories ergens binnen geslopen zijn?
Of wellicht heeft jouw webboer de PHP-versie gebumpt en/of de strictheid waarmee fouten worden gemeld opgevoerd?
Hoe dan ook, indien deze meldingen eerder niet optraden, en nu wel, houdt dat in dat er *iets* is veranderd, of dat er op een bepaalde manier andere condities gelden voor de omgeving waarin deze functionaliteit actief is.
Code (en haar werking) verandert/muteert doorgaans niet spontaan; het doet altijd precies datgene wat geschreven is.
NB sizeof() is een alias, gebruik bij voorkeur geen aliassen, want die kunnen op den duur obsolete raken/helemaal worden verwijderd.
Gewijzigd op 22/10/2020 18:02:13 door Thomas van den Heuvel