Avatar
mat.masar
Člen
Avatar
mat.masar:20.2.2015 21:31

Ahojte, dostal jsem za projekt udělat internetové poznámky s ukládáním do databáze.
Udělal jsem přidávání, ale u zobrazování nevím, jak to mám udělat. Je tam pole přes které se má vyhledat poznámka(dle nadpisu). Ale když v databázi bude jedna poznámka s nadpisem Ahoj.. a druhá s Ahojoj tak je potřebuju vypsat obě. Ale nevím jak to mám naprogramovat, aby se to vypsalo. Nikdy nebudu vědět, kolik jich v databázi může být a tak nevím jak to mám udělat.

Napadlo mě, že bych mohl udělat $pocetradku = mysql_num_row­s($vyhledanynad­pis); a pak: if $pocetradku = 1.. echo $nadpis1 atd.. nebo tak nějak..ale to bych tam mohl mít 100 podmínek a to není rozhodně dobře :D Tak jestli neví někdo jak to mám udělat.

P.S. přikládám kód:

<html>
<head>

<link rel="stylesheet" href="styl-index.css" type="text/css" />
</head>
<body>
<article>
 <form action="hl-stranka.php" method="get">
<input type="text" placeholder="Vyhledejte poznámku dle nadpisu" class="vyhledani" name="vyhledanynadpis">
<input type="image" src="vyhledat.png" value="Vyhledat">
<p class="poznamky"> Poznámky </p>

<?php
$link = mysql_connect("localhost", "root", "your_password");
 mysql_select_db('internetove-poznamky',$link);
 if (isset ($_GET["vyhledanapoznamka"]))
 {
  $vyhledanynadpis = htmlspecialchars(trim($_GET['vyhledanynadpis']));
 $vybrat = mysql_query("SELECT `nadpis` FROM `poznamky` WHERE `nadpis` = $vyhledanynadpis");
 $vysledek= mysql_fetch_assoc($vybrat);
echo $vysledek[`nadpis`];
 }


?>

</article>
</body>
</html>
 
Odpovědět 20.2.2015 21:31
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na mat.masar
Matúš Petrofčík:20.2.2015 21:37

Potrebuješ urobiť fulltextový vyhľadávač... to ja zatiaľ neviem :/

dočasným riešením by mohlo biť v sql LIKE a zástupné znaky % a _ (% znamená rôzny počet znakov, a _ jeden znak, '%ahoj%' vyhľadá aj ahojoj)...

btw: ten tvoj kód je dosť nebezpečný (napr. môžem ti vymazať všetky tabuľky v databáze aj keď nemám prístup), volá sa to sql injection... ale to si v tomto vlákne neprišiel riešiť

Nahoru Odpovědět  +3 20.2.2015 21:37
obsah kocky = r^2 ... a preto vlak drnká
Avatar
mat.masar
Člen
Avatar
mat.masar:20.2.2015 21:40

No, součástí toho zadání bylo aby to bylo ošetřené ale myslel jsem, že htmlspecialchars stačí :D a jinak to stím LIKE tak samozřejmě bude, jinak by to nevyhledalo to vím. Ale nevím jak to mám udělat(jak sem psal předtím).

A do toho mi to tedka nevypisuje ten nadpis :D

 
Nahoru Odpovědět 20.2.2015 21:40
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na mat.masar
Matúš Petrofčík:20.2.2015 21:51
htmlspecialchars($string, "UTF-8");

používaš keď vypisuješ niečo z databázy (aj to by som skôr odporúčal používať

htmlentities($string, "UTF-8");

lebo htmlspecialchars sa dá oklamať ;)

bezpečnostná chyba je keď vkladáš dáta do databázy, alebo do where ... tam použi minimálne

mysql_real_escape_string($string);

poprípade

mysqli_real_escape_string($string);

lebo mysql je od php 5.5 vyradený a nahradzuje ho mysqli

SELECT `nadpis` FROM `poznamky` WHERE `nadpis` LIKE '%ahoj%';

teda u teba skus

$vyhledanynadpis = "%" . mysqli_real_escape_string($_GET['vyhledanynadpis']) . "%";
  $vybrat = mysql_query("SELECT `nadpis` FROM `poznamky` WHERE `nadpis` LIKE $vyhledanynadpis");

cca tak dáko, musíš s tým trochu poexperimentovať

Editováno 20.2.2015 21:53
Nahoru Odpovědět  +2 20.2.2015 21:51
obsah kocky = r^2 ... a preto vlak drnká
Avatar
mat.masar
Člen
Avatar
Odpovídá na Matúš Petrofčík
mat.masar:20.2.2015 21:55

Aha, dobře teď to mám :

$vyhledanynadpis = "%" . mysqli_real_escape_string($_GET['vyhledanynadpis']) . "%";
  $vybrat = mysql_query("SELECT `nadpis` FROM `poznamky` WHERE `nadpis` LIKE $vyhledanynadpis");
echo $vybrat[`nadpis`];

Ted už je to bezbepčné? jestli jsem to pochopil dobře.

Editováno 20.2.2015 21:56
 
Nahoru Odpovědět 20.2.2015 21:55
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na mat.masar
Matúš Petrofčík:20.2.2015 21:58

vďaka použitiu mysqli_real_es­cape_string určite bezpečnejšie než predtým :)

pri výpise premennej ale odporúčam zas to htmlentities inak ti hrozí zas iné nebezpečie známe ako XSS útok, kedy sa ti na stránke vypíše škodlivý kód ktorý bol predtým uložený do databázy a pozmení ti stránku

Nahoru Odpovědět 20.2.2015 21:58
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na mat.masar
Martin Konečný (pavelco1998):20.2.2015 22:05

Nevím, jak hodně se tomu věnuješ, ale pokud tě to baví a chceš to umět (a máš do konce projektu trochu času :D), zkus se podívat na články o ovladači PDO.

Díky PDO nebudeš muset téměř vůbec bezpečnost řešit, co se vstupních dat týká - obsahuje tzv. parametrizované dotazy.

Viz články na itnetwork:
http://www.itnetwork.cz/…ovladace-pdo
http://www.itnetwork.cz/…-a-modularne
http://www.itnetwork.cz/…ion-a-obrana

Příklad užití PDO:

$db = new PDO("mysql:host=127.0.0.1;dbname=poznamky", "jmeno", "heslo");

if (isset($_GET["vyhledanaPoznamka"])) {

  // použití parametrizovaného dotazu
  $query = $db->prepare("
    SELECT informace
    FROM `poznamky`
    WHERE `nadpis` LIKE '%?%'
  ");

  // namísto otazníku se dosadí hodnota proměnné - PDO ji automaticky ošetří
  $query->execute(array($_GET["vyhledanapoznamka"]));

  // uloží vyhledaný výsledek do pole
  $data = $query->fetch(PDO::FETCH_ASSOC);

  if ($data !== FALSE) {  // FALSE je v případě, že nebyl nalezen žádný řádek
    echo $data["nadpis"];
  } else {
    echo "Nebyla nalezena žádná poznámka.";
  }
}

Nejsem si 100% jistý, zda ten zápis LIKE '%?%' je takto správně, ale řešení pomocí parametrizovaných dotazů je mnohem výhodnější.

Editováno 20.2.2015 22:05
 
Nahoru Odpovědět  +5 20.2.2015 22:05
Avatar
mat.masar
Člen
Avatar
mat.masar:20.2.2015 22:21

No, čas mám do konce příštího týdne, ale to je OOP ne? a do toho jsem moc nechtěl zacházet.

 
Nahoru Odpovědět 20.2.2015 22:21
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na mat.masar
Matúš Petrofčík:20.2.2015 22:24

ako písal pavelco: "pokud tě to baví a chceš to umět" ;)
OOP sa oplatí vedieť...

Nahoru Odpovědět 20.2.2015 22:24
obsah kocky = r^2 ... a preto vlak drnká
Avatar
mat.masar
Člen
Avatar
mat.masar:20.2.2015 22:31

Jo, to vím chtěl jsem se to naučit ale nejdřív jsem to chtěl dodělat normálně. V kroužku se učíme normální php a tak jsem nechtěl aby se mi to pletlo. Ale v plánu to mám. A jiná možnost teda není?:(

 
Nahoru Odpovědět 20.2.2015 22:31
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na mat.masar
Matúš Petrofčík:20.2.2015 22:35

"V kroužku se učíme normální php a tak jsem nechtěl aby se mi to pletlo."... to sa ti pliesť nebude, štrukturované (normálne) programovanie budeš používať stále, ale OOP ti pomôže kód rozdeliť na triedy, projekt nadobudne istý druh štruktúry, kód sa bude dať ľahšie upraviť a znovupoužiť...atď

PS: a pozri obrázok :D

Nahoru Odpovědět  +4 20.2.2015 22:35
obsah kocky = r^2 ... a preto vlak drnká
Avatar
mat.masar
Člen
Avatar
Odpovídá na Matúš Petrofčík
mat.masar:20.2.2015 22:47

No nevadí, ale tak musí to jít i jink ne? Jinak já sem dával odpovědět mam dojem ale co uz

 
Nahoru Odpovědět 20.2.2015 22:47
Avatar
Odpovídá na mat.masar
Martin Konečný (pavelco1998):20.2.2015 23:05

V tom případě je dle mě

$vyhledanynadpis = "%" . mysqli_real_escape_string($_GET['vyhledanynadpis']) . "%";

tento script OK

 
Nahoru Odpovědět  +1 20.2.2015 23:05
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na mat.masar
Honza Bittner:20.2.2015 23:29

Mnoho začátečníků se domnívá, že OOP je něco neskutečně hardcore a nikdy to nepochopí. Opak je ale pravdou, jelikož je OOP vlastně velmi jednoduché - je to totiž způsob jak dělat věci (programovat) tak, jako to je v reálném světě. Jde jen o to si zvyknout na jiný přístup.

Každopádně pokud zatím nechceš zasahovat moc do OOP tak nevadí, úplně totiž bude stačit, pokud si uděláš ten PDO wrapper a budeš jej volat v tvém současném kódu tak, jako to teď děláš s mysql/i funkcemi... :)

Na ITnetworku jest toto téma zpracováno v sérii "NERS - neobjektový redakční systém" - http://www.itnetwork.cz/php/databaze -, takže koukni na začátky. :)

V podstatě budeš psát něco jako kód níže, což určitě přežiješ a "všechno" bude díky PDO bezpečné.

Db::query(`... tvoje sql ...`, $hodnota1, $hodnota2);
Editováno 20.2.2015 23:31
Nahoru Odpovědět  +5 20.2.2015 23:29
Student FIT ČVUT. Followuj mě na https://twitter.com/tenhobi a ptej se na https://github.com/HoBi/ama.
Avatar
misaj
Člen
Avatar
misaj:21.2.2015 14:04

Ahoj, já bych pro hledání použil spíš MATCH místo LIKE. Jen si nejspíše budeš muset vytvořit index.

Něco jako takle:

SELECT * FROM poznamky WHERE MATCH(nadpis) AGAINST('$hledane_slovo');

Psal jsem to z hlavy, takže nevím jestli to bude funkční.

 
Nahoru Odpovědět 21.2.2015 14:04
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na misaj
Honza Bittner:21.2.2015 17:02

Tady je to popsán rozdíl LIKE vs MATCH... :)
http://stackoverflow.com/…2884/3281252

Nahoru Odpovědět 21.2.2015 17:02
Student FIT ČVUT. Followuj mě na https://twitter.com/tenhobi a ptej se na https://github.com/HoBi/ama.
Avatar
Samuel Illo
Redaktor
Avatar
Odpovídá na mat.masar
Samuel Illo :21.2.2015 17:52

Presne ako napísal Honza Bittner. OOP nie je niečo hardcore ale práve naopak.
Ja keď som sa učil PHP, tak som sa tiež učil najprv len štruktúrovane. Myslel som si, že OOP je len pre profesionálov a spravil som chybu. Áno, štruktúrované ťa naučí pracovať a poznať PHP lepšie, ale naopak ťa nenaučí rozmýšľať objektovo = neskorší problém a zbytočný čas navyše strávený učením.

Nahoru Odpovědět 21.2.2015 17:52
www.samuelillo.com | www.github.com/lamka02sk
Avatar
mat.masar
Člen
Avatar
Odpovídá na Honza Bittner
mat.masar:21.2.2015 21:37

Ok, díky zkusím to podle toho návodu.

 
Nahoru Odpovědět 21.2.2015 21:37
Avatar
mat.masar
Člen
Avatar
Odpovídá na Honza Bittner
mat.masar:22.2.2015 11:34

Stáhnul jsem si ten balíček co je na konci tutoriálu a upravil jsem ten kód tak, aby to sedělo na to co potřebuju já. Chtěl jsem to zpustit ale napsalo mi to chybu. Téhle chybě vůbec nerozumím tak jsem se chtěl zeptat, jestli by mi někdo nepomohl. Píše to tam chybu v souboru Db.php ale v tom souboru jsem nenašel nic konkrétního.. jsou tam jen proměnné ale žádné "dosazení" do nich. Takže vůbec nevím. Pomohl by mi někdo prosím?

 
Nahoru Odpovědět 22.2.2015 11:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.