case 'UNIEK':
                                    $UNIEK = $aggregates[$i]['UNIEK'];
p($UNIEK);h1(__LINE__ . ': ' . $i);
                                    //$UNIEK = array_unique($UNIEK);
                                    $txt = count($UNIEK);
                                    break;

p= afkorting voor print_r
h1 maak een h1 tag

de array in p heeft 132 records maar de count zegt
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given

wat loopt er fout?

Jan
>> wat loopt er fout?

Dat staat echt letterlijk in de foutmelding.
Akkoord maar de array is niet "null". Er zitten 132 records in
klopt het regelnummer?
Niet dat je een heel verkeerde var onderzoekt
Het lijkt op wat Ivo zegt. Kun je de code eromheen ook eens plaatsen en aangeven op welk regelnummer de foutmelding betrekking heeft?
<?php
class cVraag {
public $title='';
public $data=[];

public function __construct() {
$this->data = new cData;
}
}
class cData {
public $aggregates=
[
'COUNT'=>0,
'DISTINCT'=>[],
'UNIEK'=>[],
'MAX'=>-99999999,
'MIN'=>99999999,
'SUM'=>0,
'AGGREGATES'=>[]
];
public $align=[];
public $qry='';
}
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/includes.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/define.php';

function sortByTitle($a, $b){
if ($a == $b) return 0;
return ($a < $b) ? -1 : 1;
}

if (basename(uri()) == basename(__FILE__)) {
header("HTTP/1.0 404 Not Found");
exit;
}
h1('Special query\'s');

$colToernooien = getToernooien();

if(count($colToernooien)==0) {
h1('Geen toernooi (geselecteerd)');
exit;
}
$ACTIEFTOERNOOI = new clsToernooi($colToernooien[0]);

/* aggregates: ['UNIEK'], [min], [max], ['SUM'], ['avg'], ['COUNT'] */
{
$lijst=[];
for($i=0;$i<20;$i++) {
$item[]= new cVraag;
}

$item[0]->title='Alle partijen van Eerste Toernooi';
$item[0]->data->align=array('l', 'r', 'r', 'l', 'c', 'r');
$item[0]->data->aggregates=array(['UNIEK'], ['MAX', 'MIN'], ['MAX', 'MIN'], ['UNIEK'], [], ['UNIEK']);
$item[0]->data->sql = '
select
t.naam Toernooi,
refjaar Jaar,
Ronden,
concat(s1.voornaam, " ", s1.naam) Wit,
concat(mu.symboolwit, "-", mu.symboolzwart) Uitslag,
concat(s1.voornaam, " ", s1.naam) Zwart
FROM
' . TRN_PREFIX . 'toernooien t
JOIN
' . TRN_PREFIX . 'partijen p
on p.id_toernooi=t.id
JOIN
' . TRN_PREFIX . 'spelers s1
on p.speler1=s1.id
JOIN
' . TRN_PREFIX . 'spelers s2
on p.speler2=s2.id
JOIN
' . TRN_PREFIX . 'puntensysteem ps
on ps.id=t.puntensysteem
JOIN
' . TRN_PREFIX . 'mogelijkeuitslagen mu
on mu.id=p.uitslagid
WHERE
t.id=' . $ACTIEFTOERNOOI->ID . '
ORDER BY
speler1,
speler2';

$item[1]->title='Rechten voor clubs';
$item[1]->data->align=array('l', 'l', 'l', 'l', 'r', 'r');
$item[1]->data->aggregates=array(['UNIEK'], ['UNIEK'], ['UNIEK'], [], []);
$item[1]->data->sql = '
SELECT
concat(l.voornaam, " ", l.achternaam) Naam,
c.Club,
t.Taak,
uitleg Omschrijving,
Van,
Tot
FROM
' . TRN_PREFIX . 'clubs c
JOIN
' . 'POST__lidvanclub lvc
on lvc.clubid=c.id
JOIN
' . 'POST__leden l
on lvc.lidid=l.ID
JOIN
' . 'POST__member2rol mr
ON mr.member=l.ID
JOIN
' . 'POST__rollen r
ON R.id=MR.rol
JOIN
' . 'POST__rol2taak rt
ON RT.rol=R.id
JOIN
' . 'POST__taken t
ON RT.taak=T.id
WHERE
lvc.actief=1 AND
l.overleden=0 AND
true
ORDER BY
C.club,
l.voornaam,
l.achternaam,
1';

$item[2]->title='Dubbele ingavenpunten';
$item[2]->data->align=array('r', 'r');
$item[2]->data->aggregates=array([], []);
$item[2]->data->sql = '
SELECT
GROUP_CONCAT(id SEPARATOR ", "),
count(*) aantal
FROM
' . TRN_PREFIX . 'partijen p
WHERE
true
GROUP BY
speler1,
speler2
HAVING
count(id)>1
WHERE
t.id=' . $ACTIEFTOERNOOI->ID . '
ORDER BY
speler1,
speler2';

$item[3]->title='Afwezigheden dit seizoen';
$item[3]->data->align=array('l', 'l', 'r', 'r', 'r', 'l');
$item[3]->data->aggregates=array(['UNIEK'], ['UNIEK'], [], [], ['SUM'], ['UNIEK']);
$item[3]->data->sql = '
select
c.Club,
concat(l.Voornaam, " ",l.achternaam) Naam,
min(datum) Vroegste,
max(datum) Laatste,
count(datum) Aantal,
Door
FROM
(SELECT
`ID`, `NaamID`, `Datum`, `invoer`, `door`,
now(),
IF(MONTH(datum)>7, YEAR(datum), YEAR(datum)-1) seizoen
from
' . TRN_PREFIX . 'agenda_afwezig a
WHERE
#YEAR(datum)>=IF(MONTH(datum)>7, YEAR(now()), YEAR(now())-1) AND
IF(MONTH(datum)>7, YEAR(datum), YEAR(datum)-1)>=IF(MONTH(now())>7, YEAR(now()), YEAR(now())-1) AND
true
) a
JOIN
' . TRN_PREFIX . 'leden l
on l.id=a.NaamID
JOIN
' . TRN_PREFIX . 'lidvanclub lvc
on lvc.lidid=l.ID
JOIN
' . TRN_PREFIX . 'clubs c
on c.id=lvc.clubid
WHERE
(c.SPEELDAG-1)=WEEKDAY(a.Datum) AND
true
GROUP BY
c.id,
WEEKDAY(a.Datum),
l.voornaam,
l.achternaam,
door
ORDER BY
lvc.clubid,
l.voornaam,
l.achternaam';

$item[4]->title='Afwezigheden';
$item[4]->data->align=array('l', 'l', 'r', 'r', 'r', 'l');
$item[4]->data->aggregates=array(['UNIEK'], ['UNIEK'], [], [], ['SUM'], ['UNIEK']);
$item[4]->data->sql = '
select
c.Club,
concat(l.Voornaam, " ",l.achternaam) Naam,
min(datum) Vroegste,
max(datum) Laatste,
count(datum) Aantal,
Door
FROM
' . TRN_PREFIX . 'agenda_afwezig a
JOIN
' . TRN_PREFIX . 'leden l
on l.id=a.NaamID
JOIN
' . TRN_PREFIX . 'lidvanclub lvc
on lvc.lidid=l.ID
JOIN
' . TRN_PREFIX . 'clubs c
on c.id=lvc.clubid
WHERE
(c.SPEELDAG-1)=WEEKDAY(a.Datum) AND
true
GROUP BY
c.id,
WEEKDAY(a.Datum),
l.voornaam,
l.achternaam,
door
ORDER BY
lvc.clubid,
l.voornaam,
l.achternaam';

$item[5]->title='Volgende partijen';
$item[5]->data->align=array('r','r','r','l','r','l','r','l','r');
$item[5]->data->aggregates=array();
$item[5]->data->sql = '
SELECT
v.id,
Ronde,
speler1 ID_Wit,
concat(s1.voornaam, " ", s1.naam) Wit,
speler2 ID_Zwart,
concat(s2.voornaam, " ", s2.naam) Zwart,
date_format(r.Datum, "%d/%m/%Y") Datum,
v.gebruiker,
date_format(v.Changedate, "%d/%m/%Y %H:%i") Invoerdatum
FROM
' . TRN_PREFIX . 'volgenderonde v
join
' . TRN_PREFIX . 'spelers s1
on s1.id=v.speler1
join
' . TRN_PREFIX . 'spelers s2
on s2.id=v.speler2
join
' . TRN_PREFIX . 'volgenderondeinfo r
on r.id=ronde
where
v.id_toernooi=' . $ACTIEFTOERNOOI->ID . ' and
true
order by
r.datum desc,
r.id,
s1.naam';

$item[6]->title='Partijen 1° gekozen toernooi';
$item[6]->data->align=array('r','r','r','l','r','l','c', 'l','r', 'c','l','l','r');
$item[6]->data->aggregates=array(['UNIEK'], ['MAX', 'MIN'], ['MAX', 'MIN'], ['UNIEK'], [], ['UNIEK'], [], ['UNIEK'], ['COUNT']);
$item[6]->data->sql = '
Select p.id,
p.id_toernooi,
speler1 Wit_id,
concat(s1.voornaam, " ", s1.naam) Wit,
speler2 Zwart_id,
concat(s2.voornaam, " ", s2.naam) Zwart,
#Uitslagid Uitslag ,
concat(symboolwit, "-", symboolzwart) Uitslag,
po.Opmerking,
Datum,
Uitsteller,
p.IP,
p.gebruiker Invoerder,
date_format(p.Changedate, "%d/%m/%Y %H:%i") Invoer
from
' . TRN_PREFIX . 'partijen p
JOIN
' . TRN_PREFIX . 'mogelijkeuitslagen m
on m.id=p.Uitslagid
left join
' . TRN_PREFIX . 'partij_opmerkingen po
on po.partij=p.id
join
' . TRN_PREFIX . 'spelers s1
on s1.id=p.speler1
join
' . TRN_PREFIX . 'spelers s2
on s2.id=p.speler2
where
p.id_toernooi=' . $ACTIEFTOERNOOI->ID;

$item[7]->title='# Partijen ingegeven door (1° gekozen toernooi)';
$item[7]->data->align=array('l','r');
$item[7]->data->aggregates=array(['UNIEK'], ['SUM']);
$item[7]->data->sql = '
Select
gebruiker Invoerder,
count(*) Aantal
from
' . TRN_PREFIX . 'partijen p
where
p.id_toernooi=' . $ACTIEFTOERNOOI->ID . '
group by
gebruiker
order by
gebruiker ';

$item[8]->title='Laatste login';
$item[8]->data->align=array('l', 'l', 'l', 'r', 'r', 'r');
$item[8]->data->aggregates=array(['UNIEK'], ['UNIEK'], ['UNIEK'], [], [], ['SUM','MIN','MAX']);
$item[8]->data->sql = '
SELECT
concat(l.Voornaam, " ", l.Achternaam) Naam,
c.club Club,
waar Pagina,
min(datum) "Eerste keer",
max(datum) "Laatste keer",
count(l.id) "Aantal keer"
FROM
' . TRN_PREFIX . 'log log
JOIN
' . TRN_PREFIX . 'leden l
on l.ID=log.userid
JOIN
' . TRN_PREFIX . 'clubs c
on c.id=log.clubid
group by
userid,
club,
waar
order BY
l.voornaam,
l.achternaam,
max(datum) desc';

$item[9]->title='Laatste login actieve leden';
$item[9]->data->align=array('r', 'l', 'l', 'r', 'r', 'r');
$item[9]->data->aggregates=array([], ['UNIEK'], [], [], [], ['SUM']);
$item[9]->data->sql = '
SELECT UNIEK
l.id
,c.club
,concat(l.Voornaam, " ", l.Achternaam) naam
, min(datum) "Eerste keer"
,if(max(datum) is null, "", max(datum)) "Laatste keer"
,if(max(datum) is null, 0 , count(l.id)) "Aantal keer"
FROM
' . TRN_PREFIX . 'log log
JOIN
' . TRN_PREFIX . 'leden l
on l.ID=log.userid
JOIN
' . TRN_PREFIX . 'lidvanclub lvc
on l.id=lvc.lidid
and lvc.clubid=log.clubid
JOIN
' . TRN_PREFIX . 'clubs c
on c.id=log.clubid
WHERE
lvc.actief or
true
GROUP BY
userid,
log.clubid
ORDER BY
l.voornaam,
l.achternaam';

$item[10]->title='Leden zonder wachtwoord';
$item[10]->data->align=array('l','l', 'l');
$item[10]->data->aggregates=array(['UNIEK'], ['UNIEK']);
$item[10]->data->sql = '
SELECT
concat(l.Voornaam, " ", l.Achternaam) naam,
c.Club
FROM
' . TRN_PREFIX . 'leden l
JOIN
' . TRN_PREFIX . 'lidvanclub lvc
on lvc.lidid=l.id
JOIN
' . TRN_PREFIX . 'clubs c
on c.id=lvc.clubid
WHERE
l.password="" AND
lvc.actief=1 and
true
ORDER BY
club,
Voornaam,
Achternaam';

$item[11]->title='Meikermis e-mails';
$item[11]->data->align=array('l','l','c','r','r');
$item[11]->data->aggregates=array([], [], [], ['SUM'], []);
$item[11]->data->sql = '
SELECT UNIEK
concat(Voornaam, " ", Naam) naam,
email "E-mail",
Geslacht,
count(wanneer) "Aantal deelnames",
max(year(wanneer)) "Laatste deelname"
FROM
MEIKERMIS__inschrijvingen
WHERE
email<>""
Group by
Voornaam,
Naam,
email
ORDER BY
Voornaam,
Naam';


for($i=0;$i<12;$i++) {
$lijst[] = $item[$i];
}
}
if(
$_SERVER['REQUEST_METHOD'] == "POST" &&
isset(
$_POST['qry']
)
) {
//p($_POST);
$con = opendatabasei();
foreach($lijst as $item) {
if ($item->title==$_POST['qry']) {
$info=$item;
}
}
h2($info->title);
$result = mysqli_query($con, $info->data->sql);
if (!$result) {
h1('Fout in query');
localfout(mysqli_error($con));
}else{
$data = mysqli_fetch_all($result, MYSQLI_NUM);
$headers = mysqli_fetch_fields($result);
//p($headers);
if(count($data)>0) {
//p($data);
echo 'Records: ' . count($data) .
'<table class="nowrap sortable"><tr>';
$colCounter=0;
foreach($headers as $kolom) {
echo '<th data-col="' . $kolom->name . '">
<input title="Filter" onclick="event.stopPropagation();" onkeyup="updateQRYfilter()">
<br>' . $kolom->name . '</th>';
$cols[$colCounter] = new cData;
}
//p($cols) ;
echo '</tr>';
//p($data);
for($i=0;$i<$colCounter;$i++) {
$aggregates[$i]['DISTINCT']=[];
$aggregates[$i]['COUNT']=[];
$aggregates[$i]['UNIEK']=[];
}
foreach($data as $rij) {
$colCounter=0;
echo '<tr>';
foreach($headers as $kolom) {
//p($kolom);p($rij);
$g = $rij[$colCounter];
//p($g);
//$aggregates=[];
echo '<td data-col="' . ($kolom->name) . '"
class="' . $info->data->align[$colCounter] . '"
>' . $rij[$colCounter] . '</td>';
$colCounter++;
$getal = (float)$g;
$aggregates[$colCounter]['COUNT']++;
$aggregates[$colCounter]['UNIEK'][] = $g;
$aggregates[$colCounter]['DISTINCT'][] = $g;

if($aggregates[$colCounter]['MAX']>$getal) {
$aggregates[$colCounter]['MAX'] = $getal;
//p(__LINE__ . ': ' . $getal);
}

if($aggregates[$colCounter]['MIN']<$getal) {
$aggregates[$colCounter]['MIN'] = $getal;
//p(__LINE__ . ': ' . $getal);
}

$info->data->aggregates[$colCounter]['SUM'] += $getal;
}
echo '</tr>';
}

if(count($info->data->aggregates)>0) {
echo '<tfoot>';
for($i=0;$i<$colCounter;$i++) {
echo '<td>';
foreach($info->data->aggregates[($i)] as $a) {
$txt='';
switch (strtoupper($a)) {
case 'AVG':
$txt = $aggregates[$i]['SUM'] / $aggregates[$i]['COUNT'];
break;
case 'COUNT':
$txt = $aggregates[$i]['COUNT'];
break;
case 'UNIEK':
$UNIEK = $aggregates[$i]['UNIEK'];
p($UNIEK);h1(__LINE__ . ': ' . $i);
//$UNIEK = array_unique($UNIEK);
$txt = count($UNIEK);
break;
case 'DISTINCT':
$DISTINCT = $aggregates[$i]['DISTINCT'];
array_unique($DISTINCT);
$txt = count($DISTINCT);
break;
case 'MAX':
$txt = $aggregates[$i]['MAX'];
break;
case 'MIN':
$txt = $aggregates[$i]['MIN'];
break;
case 'SUM':
$txt = $aggregates[$i]['SUM'];
break;
}
echo '<div>' . $a . ': ' . $txt . '</div>';
}
echo '</td>';
}
echo '</tfoot>';
}
echo '</table>
<br><hr><br>';
}
}
}

echo '<form accept-charset="utf-8" action="' . SCHAAKFOLDER . $CLUBINFO->SLEUTEL . '/?page=qry" method="post">
Uw keuze: <select title="Maak uw keuze!" name="qry">
<option value="0">Uw keuze</option>' . PHP_EOL;
$val=0;
foreach ($lijst as $item) {
$val++;
echo '<option value="' . $item->title . '">' . $item->title . '</option>' . PHP_EOL;
}
echo '</select>
<input type="submit" value="Toon">
</form><br><br><br>' . PHP_EOL;
?>

<?php
    $item[11]->data->sql = '
                    SELECT UNIEK
                        concat(Voornaam, " ", Naam) naam,
                        email "E-mail",
                        Geslacht,
                        count(wanneer) "Aantal deelnames",
                        max(year(wanneer)) "Laatste deelname"
                    FROM
                        MEIKERMIS__inschrijvingen
                    WHERE
                        email<>""
                    Group by
                        Voornaam,
                        Naam,
                        email
                    ORDER BY
                        Voornaam,
                        Naam';
?>


ik neem aan dat UNIEK eigenlijk UNIQUE had moeten zijn?

Daarom mislukt die query.
Daarnaast moet je eens uitzoeken hoe GROUP BY werkt, want dat klopt meerdere keren ook niet (zowel te veel als te weinig kolommen als ik het goed zie)

Vraag blijft: welk regelnummer staat in de foutmelding?

En waar is getToernooien() gedefinieerd?
De query mislukt niet. Zoals al vermeld. 132 records :)
Uniek is gewoon een variable of een deel van een array.
ok: kijken we naar de query die ik hier net plakte

SELECT
Hierna komen kolommen, of bewerkingen van kolommen die je wilt ophalen uit een tabel. (in dit geval inderdaad gewoon 1 tabel)
FROM
de naam van de tabel in kwestie
WHERE
wat eisen die je hebt voor de op te halen records
GROUP BY
als je functies als COUNT() en MAX gebruikt
ORDER bY
hoe sorteren we?

Terug uitgewerkt:
SELECT: je eerste kolom heet "uniek"? rare naam, en waarom staat er geen komma achter?

Door naar group by:
hier moeten alle velden staan die niet een aggregatie functie zijn.
Dat zouden voor jou die rare "uniek" en "naam", "E-mail" en "geslacht" zijn.

Order By:
je sorteertop voornaam en Naam.
Maar Voornaam zit niet in je resultset. Wel "naam" met een kleine "n"


Vandaar dat ik denk, dat je query rare resultaten kan geven, áls die al uitgevoerd kan worden.

--
en als je ipv UNIEK toch inderdaad UNIQUE zocht: dat zou niet nodig moeten zijn. Als dat wel zo lijkt, dan klopt je group-by stuk niet.
@Jan R: Je hebt nog steeds geen antwoord gegeven op de vraag over welk regelnummer de foutmelding betrekking heeft.
@ozzie: omdat het helemaal niet ter zake doet. Op lijn 516 druk ik de inhoud vd array af terwijl op 518 er blijkbaar geen inhoud meer is :(

[size=xsmall]Toevoeging op 23/05/2025 10:55:26:[/size]

Voor wie wil testen er is een json beschikbaar: https://janr.be/data.json

[size=xsmall]Toevoeging op 23/05/2025 12:46:41:[/size]

Het is eindelijk opgelost. Nu nog wat kopteksten aanpassen.

Ik heb wel zoveel getest en aangepast dat ik niet meer weet waar het exact fout liep.

Reageren