Teen opiskelu töitä ja olen yrittänyt tietokanta hakua rakentaa (pienimuotoista) Projekteja on ollut monta, mutta aina törmään lopulta johonkin ongelmaan.Kun yritän saada hakua toimimaan, jokin mättää. Nyt tämä koodi tulostaa liikaa nettisivulle. Minulla on sellainen kolmen kohdan lomake, johon syötetään haku kriteerit ja löydetyt tuotteet tulostuvat sivulle.
esimerkki:
Tämä tulostuu myös:
SELECT * FROM tuotteet WHERE vari LIKE 'punainen' AND tuote LIKE '%korvakoru%' AND kuvaus LIKE '%hopea%' ORDER BY id ASC
Minulla on tälläinen koodi:
<?php @require_once('includes/config.php'); if (isset($_POST['submit'])) { if (isset($_POST['vari'])) { $vari = stripsql($_POST['vari']); } if (isset($_POST['tuote'])) { $tuote = stripsql($_POST['tuote']); } if (isset($_POST['kuvaus'])) { $kuvaus = stripsql($_POST['kuvaus']); } $sql = "SELECT * FROM $table"; if (($vari) || ($tuote) || ($kuvaus)) { $sql .= " WHERE "; } if ($vari) { $sql .= " vari LIKE '$vari'"; if (($tuote) || ($kuvaus)) { $sql .= " AND "; } } if ($tuote) { $sql .= " tuote LIKE '%$tuote%'"; if ($kuvaus) { $sql .= " AND "; } } if ($kuvaus) { $sql .= " kuvaus LIKE '%$kuvaus%'"; } $sql .=" ORDER BY id ASC"; $s = 0; $r = mysql_query($sql);echo $sql; echo "<table border=0>
Mod. lisäsi kooditagit ja alkuun <?php-merkinnän
Laita koodi kooditageihin.
tarjat kirjoitti:
esimerkki:
Tämä tulostuu myös:
SELECT * FROM tuotteet WHERE vari LIKE 'punainen' AND tuote LIKE '%korvakoru%' AND kuvaus LIKE '%hopea%' ORDER BY id ASC
Tottakai se tulostuu, jos tulostat sen. Katso koodisi toiseksi viimeistä riviä.
Koodia voisi myös yksinkertaistaa:
<?php if (!empty($_POST)) { $sql = "SELECT * FROM $table"; $ehdot = array(); foreach (array("vari", "tuote", "kuvaus") as $asia) { if (!empty($_POST[$asia])) { $haku = mysql_real_escape_string($_POST[$asia]); $ehdot[] = "$asia LIKE '%{$haku}%'"; } } if (!empty($ehdot)) { $sql .= " WHERE ". implode(" AND ", $ehdot); } $tulos = mysql_query($sql); if (!$tulos) die( "Virhe: <br/>". htmlspecialchars($sql). "<br/>". htmlspecialchars(mysql_error()) ); echo "<table>"; // ... }
Nyt uusien hakuehtojen lisääminen onnistuu vain muuttamalla yhtä riviä.
Kiitos kaikesta avustanne!!
Mutta osaisiko joku vielä neuvoa mikä seuraavassa koodissa on pielessä, se on lähes sama kuin edellinen, mutta siinä on vielä noita tietokannassakin olevia rivejä (tuote kuvauksia). Kun saisi jotenkin tämän koodin toimimaan. Ilman että sivulle tulee virheilmoituksia..
(Tässä ei ole hyödynnetty tuota ehdotettua lyhennystä).
<?php if (isset($_POST['submit'])) { if (isset($_POST['vari'])) { $vari = stripsql($_POST['vari']); } if (isset($_POST['tuote'])) { $tuote = stripsql($_POST['tuote']); } if (isset($_POST['kuvaus'])) { $kuvaus = stripsql($_POST['kuvaus']); } if (isset($_POST['kuvaus 2'])) { $kuvaus = stripsql($_POST['kuvaus 2']); } $sql = "SELECT * FROM $table"; if (($vari) || ($tuote) || ($kuvaus)) { $sql .= " WHERE "; } if ($vari) { $sql .= " vari LIKE '$vari'"; if (($tuote) || ($kuvaus)) { $sql .= " AND "; } } if ($tuote) { $sql .= " tuote LIKE '%$tuote%'"; if ($kuvaus) { $sql .= " AND "; } } if ($kuvaus) { $sql .= " kuvaus LIKE '%$kuvaus%'"; } $sql .=" "; $s = 0; $r = mysql_query($sql);echo $sql; echo "<table border=0> <tr> <th>Id</th> <th>Tuote</th> <th>Koko</th> <th>Väri</th> <th>Kuvaus</th> <th>Kuvaus2</th> <th>Malli</th> <th>Hinta</th></tr>"; while ($row = mysql_fetch_row($r)) { $s++; $vari = ( !($s % 2) ) ? '#cccccc' : '#ffffff'; echo '<tr bgcolor="'.$vari.'">'; echo '<td><a href="?d='.$row[0].'">'.$row[0].'</a></td>'; echo '<td>'.$row[1].'</td>'; echo '<td>'.$row[2].'</td>'; echo '<td>'.$row[3].'</td>'; echo '<td>'.$row[4].'</td>'; echo '<td>'.$row[5].'</td>'; echo '<td>'.$row[6].'</td>'; echo '<td>'.$row[7].'</td>'; echo '<td>'.$row[8].'</td>'; echo '</tr>'; } echo "</table>"; } ?>
Mod. lisäsi kooditagit, lue jo!
Postauksessa on pielessä kooditagin puuttuminen ja saadun virheilmoituksen kertomatta jättäminen. Kumpikin helpottaisi olennaisesti kysymykseen vastaamista.
Suoraan koodista näkee, että ainakin siitä
- puuttuu järkevä toistorakenteen käyttö
- puuttuu SQL-injektion esto.
- $table -muuttujaa ei ole määritelty
Ainakin koodissa on yhä sama vika kuin aiemminkin eli se, että kysely tulostetaan sivulle. Tässä ei pitäisi olla mitään ihmeellistä; PHP-koodarina varmaan tajuat, että tulostaminen tarkoittaa echoa ja kysely on muuttujassa $sql. Lisäksi pistää silmään, että taulukossasi on vain kahdeksan otsikkoa mutta silmukassa tulostat yhdeksän saraketta.
Jos olisin PHP-koodari, tuskin kysyisin neuvoa, vaan osaisin itse korjata koodissa olevat virheet ja puutteet. Kiitos näistä neuvoista..Vaikka tuskin saaan vieläkään koodista ihan sellaista mitä pitäisi.
Eikö kukaan osaa tarkemmin neuvoa mitä tuolle koodille pitäisi tehdä?
Miten nämä huomatut virheet korjaan?
- puuttuu järkevä toistorakenteen käyttö
- puuttuu SQL-injektion esto.
- $table -muuttujaa ei ole määritelty
- taulukossasi on vain kahdeksan otsikkoa mutta silmukassa tulostat yhdeksän saraketta.
tarjat kirjoitti:
Miten nämä huomatut virheet korjaan?
- puuttuu järkevä toistorakenteen käyttö
- puuttuu SQL-injektion esto.
- $table -muuttujaa ei ole määritelty
- taulukossasi on vain kahdeksan otsikkoa mutta silmukassa tulostat yhdeksän saraketta.
- Metabolix antoi sinulle valmiin koodin
- Onhan siellä itsetehty SQL-injektioiden esto (stripsql). Sen tosin voisi korvata mysql_real_escape_string:illä.
- Koodissasi on kysely "SELECT * FROM $table", kirjoita taulun nimi joko suoraan kyselyyn, tai määrittele $table.
- Koodin lopussa olevassa while-silmukassa tulostat 9 taulukon solua, siitä on helppo ottaa viimeinen pois. Lisäksi ne kannattaisi tulostaa silmukassa, niin ei olisi samaa koodia montaa kertaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.