sizeof
Hallo allemaal, ik zit met de volgende vraag:
Deze regel geeft een waarschuwing in mijn code. (Warning = sizeof(): Parameter must be an array or an object that implements Countable in)
Enig zoekwerk doet mij vermoeden dat er "is_array" voor moet komen, maar hoe precies snap ik niet.
Jan
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
Een controle of het een array is, is wel gewenst. Maar waar komt die variabele $gpx_files vandaan?
Het is dus geen array/object.
Het is dus geen array/object.
Een paar regels erboven vermoed ik.
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 -
Kan je de debug een aanzetten?
NB: Voor scripts hebben we code-tags.
NB: Voor scripts hebben we code-tags.
Gewijzigd op 22/10/2020 11:09:33 door - Ariën -
Sorry maar er is geen "code tag" hoor, heb daar al meer naar gezocht hier omdat het mij zeer verbaasde dat die er niet was.
Debug staat aan (volgens mij toch) en geeft deze melding:
Bedankt trouwens vooor je snelle reacties.
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.
Die tag is er wel. Zie ook de Veelgestelde Vragen. :-)
Als de debug aanstaat moet je een array-boom zien.
Als de debug aanstaat moet je een array-boom zien.
Gewijzigd op 22/10/2020 11:25:16 door - Ariën -
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.
Daarom moet je die var_dump() toevoegen.
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.
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?
Voor de duidelijkheid ik heb helemaal niets gemaakt omdat ik niet kan programmeren, (toch niet in php)
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.
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.
Voor het gemak heb ik een [code] tag geplaatst waarbij je dus regelnummering ziet.
Maar je moet even zoeken in je codebase naar de function: scan_dir_f
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.
Fijn dat het is opgelost het ongewenste gedrag lijkt te zijn verdwenen, maar het is natuurlijk ook interessant om te achterhalen waarom deze melding (ineens?) de kop opsteekt.
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.
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




