Autor Zpráva
honya84
Profil *
Ahoj.

Jsem úplný začátečník v php a upravuji jeden skript pro vyhledávání dat z databáze. Mám dva skripty, jeden pro vstup dat do formuláře s rolovací nabídkou výběru atributu pro vyhledání vstupního řetězce (input.php) a druhý pro výstup záznamů z databáze, které se shodují (output.php). Domnívám se, že problém je v podmínce mysql_query ( WHERE...LIKE) patrně je špatná syntaxe(?)
Prosím o shlédnutí a doporučení úpravy. Díky

Kódy:
input. php
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Vyhledávání</title>
</head>

<body bgcolor="#ffffff">

<h2>Vyhledávání</h2>

<form name="search" method="post" action="studentsearch-exec.php">
Hledej výraz: <input type="text" name="find" /> podle
<Select NAME="field">
<Option VALUE="zkr">Zkratka</option>
<Option VALUE="naz">Název</option>
<Option VALUE="sku">Skupina</option>
</Select>

<input type="submit" name="search" value="Hledej" />
</form>

</body>

</html>



output.php
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>Výsledky vyhledávání</title>
</head>
<body bgcolor="#ffffff">

<?php

echo "<h2>Výsledky vyhledávání:</h2>";
$find = $_POST['find'];                     
                    
//If they did not enter a search term we give them an error
if ($find == "")
{
echo "<p>Zapomněl jsi napsat vyhledáváný výraz.";
exit;
}
                           
// Otherwise we connect to our Database
mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("honza") or die(mysql_error());

// We perform a bit of filtering 
 $find = strtoupper($find);
 $find = strip_tags($find);
 $find = trim ($find);

//Now we search for our search term, in the field the user specified
$data = mysql_query("SELECT * FROM aa_pruvodce WHERE upper($field) LIKE'%$find%'");


echo "<table border='1'>";
echo "<tr><th>Název</th> 
      <th>Zkratka</th> 
      <th>Skupina</th>
      <th>Popisuje</th>
      <th>Druh</th>
      <th>Poskytovatel</th>
      <th>Dostupnost</th></tr>";

///And we display the results
while($result = mysql_fetch_array( $data ))
              
{
	// Print out the contents of each row into a table
	echo "<tr><td>"; 
	echo $result['NAZEV'];
	echo "</td><td>"; 
	echo $result['ZKRATKA'];
	echo "</td><td>"; 
	echo $result['SKUPINA'];
	echo "</td><td>";  
	echo $result['POPISUJE'];
	echo "</td><td>"; 
	echo $result['DRUH'];
  echo "</td><td>";  
	echo $result['POSKYTOVATEL'];
	echo "</td><td>";  
	echo $result['DOSTUPNOST'];
	echo "</td></tr>"; 

}
//This counts the number or results - and if there wasn't any it gives them a little message explaining that
$anymatches=mysql_num_rows($data);
if ($anymatches == 0)
{
echo "Tento řetězec nebyl nalezen.<br><br>";
}
//And we remind them what they searched for
{
echo "<b>Hledaným heslem bylo:</b> " .$find;
}
      ?> 
      
</body>
</html>
Keeehi
Profil
Na řádku 20 ti chybí heslo, možná jsi ho jen tady vymazal.

Toto by snad mělo fungovat

switch ($field) {
  case 'zkr': $kde='zkratka' break;
  case 'naz': $kde='nazev' break;
  case 'sku': $kde='skupina' break;
  default: $kde='nazev'    break;
}
$data = mysql_query("SELECT * FROM aa_pruvodce WHERE $kde LIKE'%$find%'");

Příště, až vám nebude SQL dotaz fungovat, tak si ho zkuste vypsat. V tomto případě byste asi zjistil, že vyhledáváte ve sloupci, který ani neexistuje.
AM_
Profil
za LIKE bych dal mezeru, nevím, jestli nedělá problém, že '%$find%' je nalepené hned na to.

Nejlepší je při ladění toto:
//nekam na zacatek aplikace placni toto:
DEFINE('DEBUG', true); //a az aplikaci publikujes, zmen to na false

//dotaz:
$data = mysql_query($q="SELECT $nejake $promenne FROM blablabla");
if (DEBUG){
  echo "Dotaz: $q<br>Chyba:".mysql_error();
}


To debug můžeš vynechat a po odladění echo smazat ručně, ovšem ono se na to rádo zapomíná a návštěvníka pak vyděsí podivný kód, případně hackerovi může poskytnout nežádoucí informace.
RadimR
Profil *
zdravim, pozivam jednoduchy skript pro vyhledavani, ale mam nekde chybu. Skript me vypise u nalezeneho zaznamu jen polozky aaa bbb ccc. Polozky ddd a eee se v nalezenem zaznamu nezobrazi, ale jde podle nich vyhledavat.
Kde mam chybu???

<?
$db="mydata";
$tb="pokus";
$spojeni = mysql_connect("localhost","user","pass");
mysql_select_db($db, $spojeni);
$result=mysql_query("SELECT aaa, bbb, ccc, ddd, eee FROM `$tb`");
//tento kód vypíše názvy sloupců:
echo ("<table border=\"2\" bordercolor=\"green\"><tr>");
for($i=0;$i<mysql_num_fields($result); $i++){
echo("<td style=\"font-weight: bold\">".mysql_field_name($result, $i)."</td>");
}
echo("</tr>");
//tento kód vypíše odpovídající položky:
$hledat = "hledaneslovo";
$vysledek1 = mysql_query("SELECT aaa, bbb, ccc, ddd, eee FROM `$db`.`$tb` WHERE
`aaa` LIKE '%".$hledat."%' OR `bbb` LIKE '%".$hledat."%' OR `ccc` LIKE
'%".$hledat."%' OR `ddd` LIKE '%".$hledat."%' OR `eee` LIKE '%".$hledat."%'");
while ($zaznam2 = mysql_fetch_array($vysledek1) ):
echo ("<tr><td>".$zaznam2["aaa"]."</td>");
echo ("<td>".$zaznam2["bbb"]."</td>");
echo ("<td>".$zaznam2["ccc"]."</td>");
echo ("<td>".$zaznam2["ddd>"]."</td>");
echo ("<td>".$zaznam2["eee>"]."</td></tr>");
endwhile;
echo("</table>");
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: