Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tietokantahaku vuotaa näkyviin!

Sivun loppuun

tarjat [18.09.2010 10:54:24]

#

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

-tossu- [18.09.2010 11:21:29]

#

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ä.

Metabolix [18.09.2010 15:06:29]

#

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ä.

tarjat [19.09.2010 13:50:49]

#

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!

Grez [19.09.2010 14:03:26]

#

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

Metabolix [19.09.2010 14:16:16]

#

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.

tarjat [19.09.2010 15:06:01]

#

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.

tarjat [22.09.2010 20:35:41]

#

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.

-tossu- [22.09.2010 20:50:16]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta