Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP +hakukone +apua tarvitaan

Sivun loppuun

juhaz [14.03.2006 22:17:31]

#

Eli kehittelin itse pientä hakukone-scriptiä ja tarvitsen nyt apua parin ominaisuuden kehittämisessä ja muutamassa pienessä ongelmassa.

Tässä lähdekoodit:

<center>
<form action="index.php" method="get">
	<p>Hakusana: <br><input type="text" name="hae"> <br>
	<input type="submit" value="lähetä"></p>
</form>

<hr>
<?php

if (isset($_GET['hae'])) {
$hakusana = $_GET['hae'];

$sivut = file("linkit.txt");
$sivut = array_reverse($sivut);
$sivumaara = count($sivut);

for ($i = 0; $i < $sivumaara; $i++) {
$tiedot = explode("|", $sivut[$i], 4);
$nimi = $tiedot[0];
$osoite = $tiedot[1];
$hakusanat = $tiedot[2];
$tieto = $tiedot[3];
$sivuja = 0;

if (stristr($hakusanat,$hakusana) == true){
$sivuja++;
echo "Yhteensä <b>$sivuja</b> sivua löydetty hakusanalla <b>$hakusana</b><br><br>";
echo ("<b><a href=\"$osoite\" target=\"_blank\">$nimi</a></b><br> $tieto <br>");
echo ("<br><br>");
}
if (stristr($hakusanat, $hakusana) == false){
echo ("hakusanalla <b>" . $hakusana . "</b> ei löydy tuloksia!<br>");
}
}
} else {
}
?>
</center>

Ongelmat:
1.Jos hakee vaikka hakusanalla "hakusana" ja tietokannassa (flat-file) on kaksi tai useampi sivu niin kaikki muut paitsi se, jonka hakusana löytyy niin niistä scripti valittaa "hakusanalla hakusana ei löydy tuloksia!" vaikka oikeasti löytyy sen yhden sivun verran. Miten tuo estetään? Tuo "Hakusanalla hakusana ei löydy tuloksia!" pitäisi näyttää vain siinä tapauksessa, kun niitä todella ei löydy.

2.Jos hakee ilman hakusanaa niin se valittaa:
"Warning: stristr(): Empty delimiter. in c:\program files\easyphp1-8\www\search\index.php on line 25

Warning: stristr(): Empty delimiter. in c:\program files\easyphp1-8\www\search\index.php on line 31"
Mitä pitää korjata, että se lopettaa tuon? Olen muuten tapellut saman ongelman kanssa ennenkin ja sain ennen korjattua ohjeiden avulla, mutta nyt en muista miten vian sai korjattua.

Uudet ominaisuudet:
1.Sivulle annetaan uusi määre "pisteet" eli piste-muuttuja, jossa sijaitsee sivun saamat pisteet. Sivun pitäisi sijoittua listalla pisteiden mukaan, joten miten tämä hoidetaan? Eniten pisteitä saanut sivu näkyy ensimmäisenä ja vähiten pisteitä saanut viimeisenä. Pitäisi olla myös keino, jolla niitä pisteitä annetaan. (Sivun tiedon vieressä tekstilinkit "anna piste" ja "poista piste"). Saisiko tähän jotenkin automatisoitua sitä, että kun sivu menee pisteissä miinuksille (=>roskaa) niin se poistetaan automaattisesti tietokannasta?

3.haut tyyliin "sivut +kissa -koira" eli se hakee kaikkia sivuja, joiden hakusanoista löytyy hakusanat "sivut" ja "kissat", mutta ei koiria? Toinen esimerkki: "ohjelmointi -quickbasic", jolloin se hakee sivuja, joiden hakusanoista löytyy ohjelmointi -sana, mutta ei quickbasicia. Ymmärsittehän?

4.MySQL-tietokannan käyttäminen flat-file tietokannan sijasta voisi olla joiltakin osin järkevämpi, nopeampi ja toimivampi systeemi. En osaa itse tehdä tuota, mutta jos jollakin on tarpeeksi aikaa ja halua niin vastaanotan mielelläni tuosta myös mysql-version.

Lebe80 [14.03.2006 22:52:01]

#

Sinulla on siis selvästikin vain suunnitteluvirhe.

Eli hakuahan ei saisi tehdä, jos hakusanaa ei ole annettu.
Ja kun hakukoneelle annetaan hakusana, tämän jälkeen luot tyhjän taulukko (array), johon lisäät vain sivut, josta löytyy hakusana hakemallasi tavalla.

Jos taulukko on tyhjä kaikkien tarkastettujen sivujen jälkeen ilmoitetaan, ettei hakusana palauttanut yhtään tulosta, muutoin näytät haun tulokset.

juhaz [14.03.2006 23:02:14]

#

Eli mitenkä tuo käytännössä tehdään sitten?

tsuriga [14.03.2006 23:10:57]

#

Ja mitä koodiin tulee niin echo on pikemminkin komentorakenne kuin funktio, joten siihen ei tulisi laittaa sulkuja. Lisäksi jos sinulla on ehto, jonka jälkeen ehdon komplementti (vastakkainen tapahtuma), niin voit korvata sen komplementin else-rakenteella. Ja stristr ei sinänsä palauta totuusarvoa onnistuneella haulla, vaan merkkijonon. Truehen vertailu kyllä toimii, mutta kannattaa silti vertailla palautusarvoa omaan tietotyyppiinsä.

ajv [15.03.2006 14:52:31]

#

4.) Tuo SQL-vastine tuolle koodillesi olis balttiarallaa seuraavanlainen:

<?php
$hakusana = mysql_real_escape_string($_GET['hakusana']);
$result = mysql_query("SELECT * FROM data WHERE kentta LIKE '%$hakusana%'");
$hits = mysql_num_rows($result);
if($hits > 0)
   echo "Yht. $hits osumaa";
   // looppaat vastaukset
}else{
   echo "Ei osumia";
}
?>

Edit: mysql_real_escape_string()

Edit2: sitä putka 2.0:llaa odotellessa...h :) Syntaksiväritys näemmä rikki

juhaz [15.03.2006 20:19:54]

#

Nyt se valittaa "Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\search\index2.php on line 45

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\search\index2.php on line 48"

<center>
<form action="index.php" method="get">
	<p>Hakusana: <br><input type="text" name="hakusana"> <br>
	<input type="submit" value="lähetä"></p>
</form>
<center>

<hr>
<?php
$yhteys = mysql_connect("localhost", "root", "salasana") or die("Yhdistäminen ei onnistunut!");
mysql_select_db("haku",$yhteys) or die("Tietokantaa ei löytynyt!");

if (isset($_GET['hakusana'])) {
$hakusana = mysql_real_escape_string($_GET['hakusana']);
$result = mysql_query("SELECT * FROM data WHERE hakusana LIKE '%$hakusana%'");
$hits = mysql_num_rows($result);
if($hits > 0)
   echo "Yht. $hits osumaa";
   for ($i = 0; $i < $hits; $i++) {
   //haetaan nimi, hinta ja määrä muuttujiin
   $nimi = mysql_result($haku, $i, "nimi");
   $osoite = mysql_result($haku, $i, "osoite");
   $tietoa = mysql_result($haku, $i, "tietoa");
   //tulostetaan taulukon rivi
   echo "<a href=\"$osoite\">$nimi</a> $tietoa";
}
   // looppaat vastaukset
}else{
   echo "Ei osumia";
}
mysql_close($yhteys);
?>

E: Toisen valituksenaiheen sain pois.

juhaz [16.03.2006 18:26:51]

#

Osaako joku neuvoa? En nimittäin saa tuota koodia toimimaan. Rivi, jota se valittaa on siis:

$hits = mysql_num_rows($result);

Se valittaa tuosta rivistä tätä:
"Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\search\index2.php on line 45 "

Juice [16.03.2006 18:42:37]

#

Kyselyssä lienee jokin virhe? Kokeile mitä heittää jos muutat tuon resulttirivin tällaiseksi:

$result = mysql_query("SELECT * FROM data WHERE hakusana LIKE '%$hakusana%'") or die(mysql_error());

juhaz [16.03.2006 18:49:53]

#

Joo vika löytyi. Se etsi tablesta data mitä ei ollut. Eli nyt on yksi vika korjattu koodista.

juhaz [17.03.2006 06:59:52]

#

Tarvitsen apua erään toiminnon kehittämisessä.
Minulla on vanhassa hakukoneessa yli 1000 sivua tallennettuna ja ne ovat kaikki yhdessä tekstitiedostossa.

Tekstitiedosto on tämän kaltainen:

nimi|osoite|luku|tietoa|hakusanat

Pitäisi saada helppo keino siirtää kaikki yli 1000 sivua mysql-tietokantaan, jonka fieldit ovat tyyliin:

nimi|osoite|tietoa|hakusanat|pisteet

Kaikkiin muihin laitetaan mitä tekstitiedostossa sanotaan paitsi pisteisiin, johon tulee vain ykkönen.

EDIT: Miksi Ä:t ja Ö:t eivät toimi mysql:ssä?
Minä laitoin PHP:ssä jo samalla tavalla kuin tekstitiedosto-pohjaisessakin hakukoneessani, mutta se ei toimi enää.

$_GET['hakusana'] = htmlentities($_GET['hakusana'], ENT_QUOTES, "ISO-8859-1");

juhaz [18.03.2006 09:51:33]

#

Voisiko joku ystävällinen auttaa minua sen verran, että yhdistää MySQL-sivutuksen:
https://www.ohjelmointiputka.net/koodivinkit/24487-php-sivutus

ja tuon minun hakukoneen sorsan niin, että se toimisi? Itse olen tapellut nyt vajaan kolme tuntia enkä ole saanut sitä toimimaan millään. Alkaa pikkuhiljaa vitutuskäyräkin olemaan jo sitä luokkaa, että ei tiedä mikä hulk-efekti oikein tapahtuu.

Minun sorsat:

<center>
<form action="index.php" method="get">
	<p>Hakusana: <br><input type="text" name="hakusana"> <br>
	<input type="submit" value="l‰het‰"></p>
</form>
</center>

<hr>
<?php
if (empty($_GET['hakusana'])) {
} else {
$_GET['hakusana'] = htmlentities($_GET['hakusana'], ENT_QUOTES, "ISO-8859-1");
$yhteys = mysql_connect("localhost", "root", "proball") or die("Yhdist‰minen ei onnistunut!");
mysql_select_db("haku",$yhteys) or die("Tietokantaa ei lˆytynyt!");

if (isset($_GET['hakusana'])) {
$hakusana = mysql_real_escape_string($_GET['hakusana']) or die(mysql_error());
$result = mysql_query("SELECT * FROM hakut WHERE hakusana LIKE '%$hakusana%' OR nimi LIKE '%$hakusana%' Or osoite LIKE '%$hakusana%' or tietoa like '%$hakusana%' ORDER BY pisteet DESC") or die(mysql_error());
$hits = mysql_num_rows($result) or die(mysql_error());
if($hits > 0)
   echo "Yht. $hits osumaa <br><br>";
   for ($i = 0; $i < mysql_num_rows($result); $i++) {
   $nimi = mysql_result($result, $i, "nimi") or die(mysql_error());
   $osoite = mysql_result($result, $i, "osoite") or die(mysql_error());
   $tietoa = mysql_result($result, $i, "tietoa") or die(mysql_error());
   //tulostetaan taulukon rivi
   echo "<a href=\"$osoite\" target=\"_blank\">$nimi</a> (<a href=\"ppiste.php?nimi=$nimi&hakusana=" . $_GET['hakusana'] . "\">+</a>/<a href=\"mpiste.php?nimi=$nimi&hakusana=" . $_GET['hakusana'] . "\">-</a>)<br> $tietoa <br>";
   echo "<small>$osoite</small><br><br>";
}
} else {
    echo "Ei osumia";
   // looppaat vastaukset
}
mysql_close($yhteys) or die(mysql_error());
}
?>

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta