Diskuze: Vypsání dat z mysql pomocí cookie
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 41 zpráv z 41.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
odstráň z tej premeny post a hod to nad sql dotaz a odstráň '''
$sql = "SELECT * FROM `stations` WHERE `country` = '".$_COOKIE["country2"]."'";
Nebo tak, jak to máš, ale do proměnné to musíš ukládat dřív, než ji používáš, ten kód se vykonává sekvenčně...
A samozřejmě, pokud jde o nějaké reálné nasazení, tak ošetřit všechny srandy typu SQL Injection apod.
mám to tak, jak jsi psal, ale stále nic, zkus si to sám pomocí local settings si navol zemi a jazyk a pak jdi na search http://radiodb.tk/local.php?…
jednak pomohl bys mi ještě s něčím? jak jsou ty if nad $sql = "SELECT * FROM tabulka $where"; tak mi web vypisuje toto: http://radiodb.tk/search.php
<?php
if (!$conn) {
echo "Connect error: " . mysql_error();
exit;
}
if (!mysql_select_db($database)) {
echo "Error selecting database: " . mysql_error();
exit;
}
$genre = $_POST['genre'];
$country = $_POST['country'];
$where = '';
if (!empty($genre) && $genre !== 'vse') {
$where .= 'WHERE `genre` = "'.mysql_real_escape_string($genre).'"';
}
if (!empty($country) && $country !== 'vse') {
$where .= (!empty($where) ? ' AND ' : ' WHERE ');
$where .= '`country` = '.intval($country);
}
$sql = "SELECT * FROM tabulka $where";
if(!isset($country) OR ($genre)){
$sql = "SELECT * FROM `stations` WHERE `country` = '.$_COOKIE["country2"].'";
}
$result = mysql_query($sql);
$value = $p['id'];
while ($p = mysql_fetch_assoc($result)) {
echo '<tr><td><a href="details.php?id='.$p['id'].'">'.$p['station'].'</a></td><td>'.$p['genre'].'</td><td>'.$p['country'].'</td></tr>';
}
echo "</table>";
mysql_free_result($result);
?>
v headu je toto:
require_once('class.translation.php');
$cookie_name = 'lang2';
$country2 = 'country2';
if(isset($_COOKIE[$cookie_name]))
$translate = new Translator($_COOKIE[$cookie_name]);
else{
$translate = new Translator('en');
}
<?php
// Overeni pripojeni k databazi
if (!$conn) {
die("Connect error: " . mysql_error());
}
// Overeni vyberu tabulky
if (!mysql_select_db($database)) {
die("Error selecting database: " . mysql_error());
}
((isset($_POST["genre"])) ? $genre = $_POST["genre"] : $genre = null);
((isset($_POST["country"])) ? $country = $_POST["country"] : $country = null);
$where = "";
if ($genre && $genre != "vse") {
$where .= "WHERE `genre` = '" . mysql_real_escape_string($genre) . "'";
}
if ($country && $country != "vse") {
$where .= (!empty($where) ? " AND " : " WHERE ");
$where .= "`country` = " . intval($country);
}
$sql = "SELECT * FROM tabulka $where";
if (empty($country) OR $genre) {
$sql = "SELECT * FROM `stations` WHERE `country` = '" . mysql_real_escape_string($_COOKIE["country2"]) . "'";
}
$result = mysql_query($sql);
$value = $p['id'];
while ($p = mysql_fetch_assoc($result)) {
echo '<tr><td><a href = "details.php?id=' . $p['id'] . '">' . $p['station'] . '</a></td><td>' . $p['genre'] . '</td><td>' . $p['country'] . '</td></tr>';
}
echo "</table>";
mysql_free_result($result);
header:
require_once('class.translation.php');
$cookie_name = 'lang2';
$country2 = 'country2';
if (isset($_COOKIE[$cookie_name]) AND ! empty($_COOKIE[$cookie_name])) {
$translate = new Translator($_COOKIE[$cookie_name]); // tady by se jeste melo overovat, zda je jazyk v poli povolenych
} else {
$translate = new Translator('en');
}
Zkus to teď a pošli výsledek.
Btw, doporučuju smazat ty pomlčky ve výběru žánru, dělá to ten select nepoužitelným.
Opět se s tím setkávám a už z toho šílím to mysqli měli už v PHP dávno
zakázat. Rozhodně to není tvoje chyba. Furt na internetu je víc jak 50%
ukázek kódu s mysqli... Použij prosím PDO. je modernější, bezpečnější
a lépe se s ním pracuje. Pokud to ještě není nějak velký projekt a
můžeš do toho sahat, udělej to. Přesně jak říkal Jakub Žák máš
tam ukázkový SQL injection.
Tady máš i diskusi na toto téma http://www.itnetwork.cz/…4455f52e6208
a zde ještě nějaké manuály k tomu PDO:
http://www.itnetwork.cz/…rud-wrapped/
http://www.itnetwork.cz/…vladace-pdo/
http://cz2.php.net/…lass.pdo.php
Kdybys chtěl s PDO poradit, klidně se zeptej
Jo, to mě nějak nenapadlo zmínit není to mysqli, ale dokonce mysql, který se dá považovat za mrtvý (v PHP 5.5 deprecated, v PHP 7 smazáno).
Pro začátky a naučení se s PDO doporučuji wrapper (obal) tady z jednoho z návodů, který ti umožní PDO používat neobjektově a hodně podobně, jako teď používáš ovladač mysql.
ještě než to zkusím ta pomlčka je řešená akorát takto <option value='Dance'>- Dance</option>
funguje vypsání z cookie, ale po nastavení země a žánru web stále ukazuje údaje z cookie.
Omlouvám se, v php moc neumím
Jde o to, že tím znemožníš použití klávsnice. Pokud ta možnost nebude začínat pomlčkou, tak můžeš začít na klávesnici psát začáteční písmena volby a nemusíš rolovat myší nebo šipkami.
No jo, ta podmínka je nějaká zvláštní - pokud je prázdná země NEBO je nastavený žánr, tak vypiš dle Cookie. Zkus tohle:
if (empty($country) AND !empty($_COOKIE["country2"])) {
$sql = "SELECT * FROM `stations` WHERE `country` = '" . mysql_real_escape_string($_COOKIE["country2"]) . "'";
}
budu to muset udělat přes PDO protože:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/u138846067/public_html/search.php on line 366
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/u138846067/public_html/search.php on line 371
Dej před to, kde ti to vyhazuje to upozornění
echo mysql_error();
teď to říká toto, zkoušel jsem ty dosazovací ify předělat
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given
in /home/u138846067/public_html/search.php on line 366
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /home/u138846067/public_html/search.php on line 371
tak jo, byla tam špatně sql, nenapsal jsem tam název tabulky.
Pro změnu se mi vypisují rádia ze všech zemí. žánr funguje, ten to
vyfiltruje, ale země ne.
http://radiodb.tk/search.php
$where = "";
if ($genre && $genre != "vse") {
$where .= "WHERE `genre` = '" . mysql_real_escape_string($genre) . "'";
}
if ($country && $country != "vse") {
$where .= (!empty($where) ? " AND " : " WHERE ");
$where .= "`country` = " . intval($country);
}
$sql = "SELECT * FROM `stations` $where";
if (empty($country) AND !empty($_COOKIE["country2"])) {
$sql = "SELECT * FROM `stations` WHERE `country` = '" . mysql_real_escape_string($_COOKIE["country2"]) . "'";
}
Dej před to, kde ten dotaz vykonáváš:
echo $sql;
je to tam, ale echo nic nevypisuje
To je blbost. Pokud máš to echo přímo před mysql_query($sql) a nic nevypisuje, znamená to, že žádný dotaz do databáze neexistuje. Takže jedině, že bys to někde "mazal".
bylo to uložený do jinýho umístění. Je tam ještě stará verze.
echo: SELECT * FROM stations
WHERE country
= 0
a country = 0 je co za zemi? je to ta správná?
moc tam nechápu to intval($country), to by mělo dělat co?
Pokud to dobře chápu, tak z formuláře ti přijde jako string a v atabázi máš jazyk jako číslo, takže budeš potřebovat nějakou převodní tabulku (nebo ve formuláři mít ta čísla).
country=0: není to země, když zadám například Czech republic tvar vypadá takto: search.php?country=Czech%20republic
intval($country): toto jsem našel na diskusi jakpsátweb, chlapík říkal, že mu to tam fungovalo
a když se oboje hodí jako mysql_real_escape_string, tak to říká chybu:
You have an error in your SQL syntax; check the manual that corresponds to
your MariaDB server version for the right syntax to use near 'Republic' at line
1
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given
in /home/u138846067/public_html/search.php on line 365
intval() převede string na integer. Tzn. jakoukoliv zemi převede na 0.
intval("10") = 10
intval("7") = 7
intval("8.4") = 8
intval("Czech Republic") = 0
intval("jakákoliv věta bez čísel") = 0
Ty potřebuješ použít nějakou tabulku (pole), která Ti převede jazyk z textu na číslo.
např.
array("Czech Republic" -> 666, "Some Country" -> 42)
nemusí to být takto, stačí mi tam normální text, protože pochybuju, že to bude extra velkej web. Ale právě nevím jak tram zachovat ten text, jestli to pojede přes POST...
Chybu ti to hází, protože Czech Republic není v uvozovkách
děkuju:)
Tohle je spatně navrhnutá databáze. Jak sám vidíš, ty státy se opakují a tím ti vznikají tzv. Redundantní data. Proto je lepší udělat tabulku country se sloupci id a name a v té tabulce stanic mít country_id. stejný postup i u toho žánru (tam by bylo dokonce nejlepší udělat mezitabulku ke budeš spojovat žánry se stanicí. protože stanice může hrát víc žánrů). Ušetřís tím data a databáze bude profesionálnější a čistější
přemýšlým o jiném hostingu, takže to udělám tam, doména .tk je prostě na dvě věci.
Takhle by podle mě měla ta DB vypadat. SQL ovládáš, abys věděl jak pak "slepit" ty tabulky?
neovládám, dotazy byly poskládány z internetových řešení
Doména != hosting ale pravda že .tk zní šíleně. Jak ses k tomu dostal? doporučuji https://hosting.wedos.com/ se spojením http://kuponwedos.cz/ se dostaneš na moc pěkný ceny za normální .cz doménu
wedos má zdarma .eu doménu jako dárek
No dostal jsem se k tomu od kamaráda, který dřív dělal djeye a chtěl
nějakej web a na internetu našel zdarma tuhle .tk doménu.
Doména != hosting (Vím) teď jedu na hostingeru 2GB zdarma, ale ty podmínky, máš chuť je přetáhnout. Jsem si musel otevřít pusu, aby mi to dali bez drahý sms aktivace.
Zobrazeno 41 zpráv z 41.