Hallo,

ik heb wat problemen met onderstaande code. Hij geeft de resultaten wel weer maar geeft daarbij de volgende melding:

Notice: Undefined index: in /var/www/vhosts/bla.nl/httpdocs/1.php on line 36

de desbetreffende regel is:

<?php
$score[$row['categorie']] += $row['occurrences'];
?>

en dit is de volledige code


<?php

$zoekterm = $_GET['zoekterm'];
$zoekterm_array = explode(" ", $zoekterm);

$score = array();
foreach($zoekterm_array as $zoekterm)
{

$result = mysql_query("SELECT *,
COUNT(*) AS occurrences FROM page p, word w, occurrence o
WHERE p.page_id = o.page_id AND
w.word_id = o.word_id AND
w.word_word = \"$zoekterm\"
GROUP BY p.page_id
ORDER BY occurrences DESC
LIMIT 0, 5" );

for( $i = 1; $row = mysql_fetch_array($result); $i++ )
{
$score[$row['categorie']] += $row['occurrences'];
}
}

if(count($score) > 0)
{
arsort($score);

while ($element = each($score))
{
echo $element[ "key" ];
echo " - ";
echo $element[ "value"];
echo " ";
}
}
else
{
//geen resultaten gevonden
}
?>

iemand een idee wat er met bovenstaande code mis is ?


PROBLEEM 2

met behulp van onderstaande code haal ik "categorie" uit de resultaten naar boven, echter wil ik naast categorie ook "omschrijving" en "link" uit de resultaten halen.

<?php
$score[$row['categorie']] += $row['occurrences'];
?>

Maar het lukt me niet om deze dan goed naar het scherm te schrijven.

het moet dus iets worden als:

echo $element[ "categorie" ];
echo $element[ "omschrijving" ];
echo $element[ "link" ];


iemand een idee hoe ik dit voor elkaar kan krijgen ?
je moet 'm wel weer sluiten natuurlijk, en volgens mij met haakjes in plaats van [ en ].

dus
<?php
$score[$row['categorie']] += $row['occurrences'];
?>

moet dit worden:

<?php
$score($row['categorie'] += $row['occurrences']);
?>

Groet,

Barry
PROBLEEM 2:

je bedoelt zeker dat ie alles achterelkaar zet?

doe het dan zó:

echo $element[ "categorie" ] . "<br />";
echo $element[ "omschrijving" ] . "<br />";
echo $element[ "link" ] . "<br />";

uitleg:

. betekent eigenlijk +
"" zijn omdat het een echo is, dus hij echo't naar de html pagina
<br /> staat voor een line-break in html

groet,

Barry
bedankt voor de reactie,ik ga het meteen even proberen
Het lukt me niet om de gegevens naar het scherm te schrijven...hoe ze op het scherm verschijnen doet er nu even niet toe, als ze dus maar verschijnen.


het onderstaande werkt prima, maar laat dus alleen maar 1 waarde zien.
Echter kan ik ipv key en value geen andere waarden invullen ivm de each functie...iemand een idee hoe ik dit op moet lossen of welke functie ik kan gebruiken om alles naar het scherm te schrijven ?

<?php

while ($element = each($score))
{
echo $element[ "key" ];
echo " - ";
echo $element[ "value"];
echo " ";
}
?>
Even een paar vraagjes:
- Wat wil je nu precies op het scherm hebben?
- Waarom gebruik je een for-lus daar waar een while-lus voor de hand ligt?
- Waarom ga je met arsort() sorteren wanneer je in de query eenvoudig kunt sorteren?
- Waarom neem jij aan dat de query altijd lukt? Je hebt de garantie dat dit niet het geval is.
ik haal uit de query resultaten op waaronder "categorie", "omschrijving" , "link" etc.

deze resultaten zijn al gesorteerd op relevantie (ORDER BY occurrences DESC), echter als men zoekt met meerdere zoektermen klopt de relevantie niet.

Zoekt men bijvoorbeeld op "leuke fietsen" dan ranken resultaten met het woord "leuke" hoger dan resultaten met de woorden "leuke fietsen" en dat is natuurlijk niet de bedoeling!

Vandaar ook dat er nog een extra score aan gehangen word.

het is de bedoeling dat de score berekend word adhv de resultaten en deze netjes naar het scherm worden geschreven.

Echter heb ik nu dus 2 problemen:

1. de foutmelding : undefined index
2. het lukt me alleen om 1 onderdeel van het resultaat naar het scherm te schrijven met daarachter de score. dit omdat ik door de each functie alleen met value en key kan werken voor zover ik weet.

Ik moet dus een andere functie gebruiken, heb er al veel over gepiekerd, maar ik heb werkelijk waar geen idee hoe ik dit moet doen.

de query zelf werkt goed, deze heb ik in php myadmin uitgebreid getest...of doelde je op de foutafhandeling ?

dat met de for lus en while lus begrijp ik niet helemaal, waarom ligt een while lus daar voor de hand ?

alvast bedankt voor je reactie
de foutmelding : undefined index (probleem 1) is nu opgelost door het gebruik van ISSET :

<?php

for( $i = 1; $row = mysql_fetch_array($result); $i++ )
{

$omschrijving = $row['omschrijving'];
$naam = $row['naam'];
$oc = $row['occurrences'];

if (isset($score[$omschrijving . $naam]))
{
$score[$omschrijving . $naam] += $oc;
}
else
{
$score[$omschrijving . $naam] = $oc;
}

?>

Nu zoek ik alleen nog een manier om de resultaten goed naar het scherm te schrijven.

alle data zit nu dus in $score :

<?
while ($element = each($score))
{
echo $element[ "key" ]. "<br />";
echo " - ";
echo $element[ "value"]. "<br />";
echo "";
}
}
else
?>

maar hij zet alles nu achter elkaar (dus naam en omschrijving zijn in dit geval "key". is er een mogelijkeid om deze data te scheiden ?

dus ipv echo $element[ "key" ].

iets van :

echo $element[ "key.naam" ].
echo $element[ "key.omschrijving" ].

of is dat niet mogelijk ?

frank,

je hebt overigens gelijk mbt de for lus...deze heb ik aangepast naar een while lus...de for lus werkte wel, maar was inderdaad niet nodig
echter als men zoekt met meerdere zoektermen klopt de relevantie niet.
In dat geval is de query dus niet goed. Een query is niets meer dan een vraag waar jij een correct antwoord op wilt krijgen. Wanneer dan het antwoord niet overeenkomt met datgene dat jij verwacht, dan is de vraag niet goed gesteld of er ontbreken gegevens.

Jij probeert nu een deel van de vraag op te lossen in php. Dat maakt de boel onnodig ingewikkeld en zal waarschijnlijk leiden tot een lapmiddel. Ga dus nog eens heel goed kijken hoe je de query moet opstellen om wél het juiste antwoord te krijgen.

En wat betreft het mislukken van de query, daar heb ik het inderdaad over de foutafhandeling. De query kan nog zo goed zijn, dat zegt helemaal niets over de beschikbaarheid van de database.
ik begrijp je punt en heb er ook wel degelijk over nagedacht. Ik heb nu na lang denken het volgende gemaakt (zie onderstaande code). Dit werkt op zich prima alleen geeft hij de resultaten maar voor 80% goed weer.

Nu zoek ik in onderstaand voorbeeld dus op "batavus fietsen". nu komt het voor dat een resultaat met daarin "batavus fietsen" lager op de resultaten lijst staat dan een resultaat met 3x het woord "fietsen"...ik wil dit dus voorkomen / oplossen en wil resultaten die alle zoekwoorden bevatten bovenaan hebben in de resultaten, maar heb echt geen idee hoe ik dat moet doen...

zou je me een beetje op weg kunnen helpen ?


<?php

$zoekwoorden = 'batavus fietsen';

$zoekterm = explode(" ", $zoekwoorden);

$query = "SELECT categorie, leeftijd, naam, naamsite, omschrijving, url, website, woonplaats,
soort, ctags, atags, tags,
COUNT(*) AS occurrences FROM page p, word w, occurrence o
WHERE p.page_id = o.page_id AND
w.word_id = o.word_id AND
w.word_word = \"$zoekterm[0]\"
GROUP BY p.page_id
ORDER BY occurrences DESC
LIMIT 0, 200";

for($i = 1;$i < count($zoekterm); $i++)
{
$query = "SELECT categorie, leeftijd, naam, naamsite, omschrijving, url, website, woonplaats,
soort, ctags, atags, tags,
COUNT(*) AS occurrences FROM page p, word w, occurrence o
WHERE p.page_id = o.page_id AND
w.word_id = o.word_id AND
w.word_word = \"$zoekterm[$i]\"
GROUP BY p.page_id
ORDER BY occurrences DESC
LIMIT 0, 200";
}

$res = mysql_query($query) or trigger_error(mysql_error());

if ($res == 0)
{
//Display a no pages found page
}

else
{
while ($row = mysql_fetch_assoc($res))
{
echo $row['naam']."<br/>";
echo $row['occurrences']."<br/>";
}
}
?>

Reageren