Avatar
KAVI
Redaktor
Avatar
KAVI:24.6.2016 20:44

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.6.2016 20:44
Avatar
Odpovídá na KAVI
Dominik Gavrecký:24.6.2016 20:47

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

Editováno 24.6.2016 20:48
Nahoru Odpovědět  +1 24.6.2016 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
Odpovídá na KAVI
Dominik Gavrecký:24.6.2016 20:47

Máš to hore

Nahoru Odpovědět 24.6.2016 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 KAVI
Jakub Žák:24.6.2016 22:04
$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.6.2016 22:04
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
Odpovídá na Jakub Žák
KAVI:25.6.2016 10:28

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.6.2016 10:28
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 11:01

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

Nahoru Odpovědět 25.6.2016 11:01
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 11:20

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.6.2016 11:21
 
Nahoru Odpovědět 25.6.2016 11:20
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 11:52
<?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.6.2016 11:53
Nahoru Odpovědět 25.6.2016 11:52
Kuba je ajťák. Buď jako Kuba.
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Jakub Žák
Jakub Žák:25.6.2016 12:01

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.6.2016 12:01
Kuba je ajťák. Buď jako Kuba.
Avatar
Snorlax
Redaktor
Avatar
Snorlax:25.6.2016 12:05

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.6.2016 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:25.6.2016 12:13

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.6.2016 12:13
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
Odpovídá na Jakub Žák
KAVI:25.6.2016 12:24

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.6.2016 12:24
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 12:30

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.6.2016 12:30
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 12:40

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.6.2016 12:40
Kuba je ajťák. Buď jako Kuba.
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 12:42

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.6.2016 12:42
Nahoru Odpovědět 25.6.2016 12:42
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 13:50

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.6.2016 13:50
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 14:02

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

echo mysql_error();
Nahoru Odpovědět 25.6.2016 14:02
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 14:02

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.6.2016 14:02
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 14:10

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.6.2016 14:10
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 14:36

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

echo $sql;
Nahoru Odpovědět 25.6.2016 14:36
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 14:45

je to tam, ale echo nic nevypisuje

 
Nahoru Odpovědět 25.6.2016 14:45
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 14:50

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.6.2016 14:50
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 14:54

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.6.2016 14:54
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 14:58

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

Nahoru Odpovědět 25.6.2016 14:58
Kuba je ajťák. Buď jako Kuba.
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 15:01

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

Nahoru Odpovědět 25.6.2016 15:01
Kuba je ajťák. Buď jako Kuba.
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 15:05

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.6.2016 15:05
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 15:06

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.6.2016 15:06
 
Nahoru Odpovědět 25.6.2016 15:06
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 15:09

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.6.2016 15:09
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 15:12

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.6.2016 15:13
Nahoru Odpovědět 25.6.2016 15:12
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 15:20

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.6.2016 15:20
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na KAVI
Jakub Žák:25.6.2016 15:21

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

Nahoru Odpovědět 25.6.2016 15:21
Kuba je ajťák. Buď jako Kuba.
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:25.6.2016 15:22

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

Nahoru Odpovědět 25.6.2016 15:22
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 15:24

Takto :) slovy

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

a samozřejmě vyescapovat

Editováno 25.6.2016 15:25
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 25.6.2016 15:25
Kuba je ajťák. Buď jako Kuba.
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 15:29

děkuju:)

 
Nahoru Odpovědět  +1 25.6.2016 15:29
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na KAVI
Snorlax:25.6.2016 15:31

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.6.2016 15:33
Nahoru Odpovědět  +1 25.6.2016 15:31
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 15:36

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.6.2016 15:36
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na KAVI
Snorlax:25.6.2016 15:44

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.6.2016 15:44
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 15:49

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

 
Nahoru Odpovědět 25.6.2016 15:49
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na KAVI
Snorlax:25.6.2016 15:49

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.6.2016 15:49
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
KAVI
Redaktor
Avatar
KAVI:25.6.2016 15:54

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