Diskuze: Vypsání dat z mysql pomocí cookie

PHP PHP Vypsání dat z mysql pomocí cookie American English version English version

Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

Ahoj, mám web a chtěl bych se zeptat, jak napsat příkaz v php tak, aby se mi do řetězce sql vypsala data z cookie, zkoušel jsem:

<? if (isset($_GET['country'])){
          $sql = "SELECT * FROM `stations` WHERE `country` = '$pcountry'";
          }
          $pcountry = $_POST[$_COOKIE['country2']];
        ?>

Nevíte jak na to? promiňte jsem začátečník. A ano cookie existuje.

 
Odpovědět 24. června 20:44
Avatar
Odpovídá na seejay.15.3
Dominik Gavrecký:

odstráň z tej premeny post a hod to nad sql dotaz a odstráň '''

Editováno 24. června 20:48
Nahoru Odpovědět  +1 24. června 20:47
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Nahoru Odpovědět 24. června 20:47
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:
$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.

 
Nahoru Odpovědět  ±0 24. června 22:04
Avatar
seejay.15.3
Redaktor
Avatar
Odpovídá na Jakub Žák
seejay.15.3:

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?…

 
Nahoru Odpovědět 25. června 10:28
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

Pošli větší část kódu.

 
Nahoru Odpovědět 25. června 11:01
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

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');
  }
Editováno 25. června 11:21
 
Nahoru Odpovědět 25. června 11:20
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:
<?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.

Editováno 25. června 11:53
 
Nahoru Odpovědět 25. června 11:52
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Jakub Žák
Jakub Žák:

Btw, doporučuju smazat ty pomlčky ve výběru žánru, dělá to ten select nepoužitelným.

 
Nahoru Odpovědět 25. června 12:01
Avatar
Snorlax
Redaktor
Avatar
Snorlax:

Opět se s tím setkávám a už z toho šílím :D 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 :)

Nahoru Odpovědět  +3 25. června 12:05
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:

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.

http://www.itnetwork.cz/…ql-ovladace/

 
Nahoru Odpovědět 25. června 12:13
Avatar
seejay.15.3
Redaktor
Avatar
Odpovídá na Jakub Žák
seejay.15.3:

ještě než to zkusím ta pomlčka je řešená akorát takto <option value='Dance'>- Dance</option>

 
Nahoru Odpovědět 25. června 12:24
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

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 :(

 
Nahoru Odpovědět 25. června 12:30
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

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.

 
Nahoru Odpovědět 25. června 12:40
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

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"]) . "'";
}
Editováno 25. června 12:42
 
Nahoru Odpovědět 25. června 12:42
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

budu to muset udělat přes PDO protože:

Warning: mysql_fetch_as­soc(): supplied argument is not a valid MySQL result resource in /home/u13884606­7/public_html/se­arch.php on line 366

Warning: mysql_free_re­sult(): supplied argument is not a valid MySQL result resource in /home/u13884606­7/public_html/se­arch.php on line 371

 
Nahoru Odpovědět 25. června 13:50
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

Dej před to, kde ti to vyhazuje to upozornění

echo mysql_error();
 
Nahoru Odpovědět 25. června 14:02
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

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/u13884606­7/public_html/se­arch.php on line 366

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /home/u13884606­7/public_html/se­arch.php on line 371

 
Nahoru Odpovědět 25. června 14:02
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

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"]) . "'";
}
 
Nahoru Odpovědět 25. června 14:10
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

Dej před to, kde ten dotaz vykonáváš:

echo $sql;
 
Nahoru Odpovědět 25. června 14:36
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

je to tam, ale echo nic nevypisuje

 
Nahoru Odpovědět 25. června 14:45
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

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

 
Nahoru Odpovědět 25. června 14:50
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

bylo to uložený do jinýho umístění. Je tam ještě stará verze.
echo: SELECT * FROM stations WHERE country = 0

 
Nahoru Odpovědět 25. června 14:54
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

a country = 0 je co za zemi? je to ta správná?

 
Nahoru Odpovědět 25. června 14:58
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

moc tam nechápu to intval($country), to by mělo dělat co?

 
Nahoru Odpovědět 25. června 15:01
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

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

 
Nahoru Odpovědět 25. června 15:05
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

country=0: není to země, když zadám například Czech republic tvar vypadá takto: search.php?cou­ntry=Czech%20re­public

intval($country): toto jsem našel na diskusi jakpsátweb, chlapík říkal, že mu to tam fungovalo

Editováno 25. června 15:06
 
Nahoru Odpovědět 25. června 15:06
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

a když se oboje hodí jako mysql_real_es­cape_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/u13884606­7/public_html/se­arch.php on line 365

 
Nahoru Odpovědět 25. června 15:09
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

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)

http://php.net/…n.intval.php

Editováno 25. června 15:13
 
Nahoru Odpovědět 25. června 15:12
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

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

 
Nahoru Odpovědět 25. června 15:20
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na seejay.15.3
Jakub Žák:

Chybu ti to hází, protože Czech Republic není v uvozovkách

 
Nahoru Odpovědět 25. června 15:21
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:

Jak jsou země v databázi? Číslem nebo slovem?

 
Nahoru Odpovědět 25. června 15:22
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

Takto :) slovy

 
Nahoru Odpovědět 25. června 15:24
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:
$where .= "`country` = '" . $country."'";

a samozřejmě vyescapovat

Editováno 25. června 15:25
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 25. června 15:25
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

děkuju:)

 
Nahoru Odpovědět  +1 25. června 15:29
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na seejay.15.3
Snorlax:

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ší

Editováno 25. června 15:33
Nahoru Odpovědět  +1 25. června 15:31
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

přemýšlým o jiném hostingu, takže to udělám tam, doména .tk je prostě na dvě věci.

 
Nahoru Odpovědět  +1 25. června 15:36
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na seejay.15.3
Snorlax:

Takhle by podle mě měla ta DB vypadat. SQL ovládáš, abys věděl jak pak "slepit" ty tabulky?

Nahoru Odpovědět 25. června 15:44
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

neovládám, dotazy byly poskládány z internetových řešení :D

 
Nahoru Odpovědět 25. června 15:49
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na seejay.15.3
Snorlax:

Doména != hosting :) ale pravda že .tk zní šíleně. Jak ses k tomu dostal? :D 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 ;)

Nahoru Odpovědět 25. června 15:49
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
seejay.15.3
Redaktor
Avatar
seejay.15.3:

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.

 
Nahoru Odpovědět 25. června 15:54
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 41 zpráv z 41.