Chyba syntaxe – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Chyba syntaxe – PHP – Fórum – Programujte.comChyba syntaxe – PHP – Fórum – Programujte.com

 

Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #1
-
0
-

Dobrý den. Začínám s mysql a pořád mi jeden skript háže chybu a už opravdu nevím co s tím. Mohl by mi prosím někdo pomoct? Díky :) Chyba: Parse error: syntax error, unexpected '`'

Nahlásit jako SPAM
IP: 77.92.206.–
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #2
-
0
-

   

<?php
			$servername = "localhost";
			$username = "mynhl";
			$password = "vojtaatjov";
			$dbname = "mynhl";

			// Create connection
			mysqli_connect($servername, $username, $password, $dbname);
			
			$vysledek = SELECT `obsah` FROM clanky WHERE MAX(`clanky_id`);
			$num = $num - 1;
			
			echo ("$vysledek");
			?>
Nahlásit jako SPAM
IP: 77.92.206.–
z_moravec
~ Redaktor
+3
Posthunter
24. 11. 2015   #3
-
0
-

Chyba je nejspíš tady:

$vysledek = "SELECT `obsah` FROM clanky WHERE MAX(`clanky_id`)";

Chybí ti uvozovky kolem SQL dotazu.

Nahlásit jako SPAM
IP: 46.39.183.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #4
-
0
-

Btw. rádek 20 je $vysledek=...

A asi si budu muset změnit heslo :D.

Nahlásit jako SPAM
IP: 77.92.206.–
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #5
-
0
-

Ale když to udělám, tak mi to vypíše ten sql příkaz.

Nahlásit jako SPAM
IP: 77.92.206.–
z_moravec
~ Redaktor
+3
Posthunter
24. 11. 2015   #6
-
0
-

#2 Shark

Mimo dotaz, ten kód ti žádný výsledek z databáze nevrátí. Doporučuji si nastudovat toto:

http://php.net/manual/en/class.mysqli.php

Nahlásit jako SPAM
IP: 46.39.183.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #7
-
0
-

Aha, díky moc za pohotovou reakci, ani jsem tak rychlou odezvu nečekal :D.

Nahlásit jako SPAM
IP: 77.92.206.–
Kit+15
Guru
24. 11. 2015   #8
-
0
-

#7 Shark
Ten SQL dotaz bych změnil: 

SELECT `obsah` FROM clanky ORDER BY `clanky_id` DESC LIMIT 1;

Databáze takový dotaz zvládne o něco rychleji a vypadá to i lépe.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #9
-
0
-

Já potom ale budu ještě potřebovat brát třeba o jedno nižší apod, MAX(`clanky_id`) - 1.

Nahlásit jako SPAM
IP: 77.92.206.–
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #10
-
0
-

A pochopil jsem správně, že to pak mám strčit do query?

Nahlásit jako SPAM
IP: 77.92.206.–
Kit+15
Guru
24. 11. 2015   #11
-
0
-

#9 Shark
Proč si nevytáhneš oba články naráz? 

SELECT `obsah` FROM clanky ORDER BY `clanky_id` DESC LIMIT 2;

Musíš počítat s tím, že třeba MAX(`clanky_id`) - 1 nebude třeba vůbec existovat, protože ho někdo smazal.

... a máš je hezky v pořadí nejnovější, starší, starší,...

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #12
-
0
-

#11 Kit
A jak je potom rozdělím?

Nahlásit jako SPAM
IP: 77.92.206.–
Kit+15
Guru
24. 11. 2015   #13
-
0
-

#12 Shark
Máš je v tom výstupu normálně za sebou přesně v požadovaném pořadí. V cyklu vezmeš první, pak druhý,...

Doufám, že nehodláš databázi pokládat dotazy uvnitř cyklu, že ne? Že to nebudeš dělat?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #14
-
0
-

Mohl by jsi mi prosím uvést příklad? Začínám a moc nevím o co jde.

Nahlásit jako SPAM
IP: 77.92.206.–
Kit+15
Guru
24. 11. 2015   #15
-
0
-

#14 Shark
Příklad mohu napsat, ale bude to chvilku trvat, protože místo MySQLi používám modernější PDO. Nechceš také přejít?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #16
-
0
-

Právě jsem přemýšlel co je lepší :D. Každopádně, nechci tě zdržovat.

Nahlásit jako SPAM
IP: 77.92.206.–
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #17
-
0
-

Vzhledek k tomu, že z mysqli toho moc neumím, tak s tím nemám problém

Nahlásit jako SPAM
IP: 77.92.206.–
Kit+15
Guru
24. 11. 2015   #18
-
0
-

#17 Shark
Tady to máš komplet pro PDO včetně plné podpory češtiny v UTF-8 a ošetření výstupu do HTML: 

<?php
$servername = "localhost";
$username = "mynhl";
$password = "vojtaatjov";
$dbname = "mynhl";
$dbOptions = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
$dsn = "mysql:host=$servername;dbname=$dbname";
// Create connection
$db = new PDO($dsn, $username, $password, $dbOptions);

$sql = "SELECT `obsah` FROM clanky ORDER BY `clanky_id` DESC LIMIT 2";
foreach ($db->query($sql, PDO::FETCH_ASSOC) as $clanek) {
    echo '<p>' . htmlspecialchars($clanek['obsah']) . '</p>';
}
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #19
-
0
-

Děkuji moc! A teď budu mít výsledky v poli $clanek a vyvolám je klasicky indexem?

Nahlásit jako SPAM
IP: 77.92.206.–
Kit+15
Guru
24. 11. 2015   #20
-
0
-

#19 Shark
V proměnné $clanek (není to pole, ale slovník) je vždy (jak název napovídá) pouze jeden článek, resp. všechny sloupce, na které ses ptal. Ptal ses pouze na sloupec `obsah`, bude tam tedy jen jeden. Může jich tam však být víc.

Cyklus foreach prochází seznam získaných článků sekvenčně, v našem případě tedy proběhne 2×. Pokud bys to chtěl mít v jednom seznamu slovníků, dělá se to obvykle trochu jinak prostřednictvím metody fetchAll(). I tak bys měl raději zapomenout na indexy, ty se při zpracování výstupu z DB obvykle nepoužívají, neboť jsou svým způsobem nebezpečné - a také nepotřebné.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #21
-
0
-

#20 Kit
díky moc! Moc mi to pomohlo :)

Nahlásit jako SPAM
IP: 77.92.206.–
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #22
-
0
-

Omlouvám se, ale ještě jednou se zeptám. Vzhledem k tomu že se v tom PDO ještě moc nevyznám, tak to nemůžu opravit. Teď mi to vypíše ty dva články. Ale já bych chtěl vypsat jen a pouze ten druhý, jde to? Jestli je to něco naprosto triviálního a já tě s tím otravuju, tak se omlouvám :).

Nahlásit jako SPAM
IP: 77.92.206.–
Kit+15
Guru
24. 11. 2015   #23
-
0
-

#22 Shark
Nejprve se zamysli: Proč chceš jen druhý a ne ten první? Možná jen proto, že máš vypsán seznam článků a klikl jsi na odkaz, že chceš právě ten druhý. V tom případě je nejlepší použít jeho ID v dotazu: 

<?php
// :
$db = new PDO($dsn, $username, $password, $dbOptions);

$sql = "SELECT `obsah` FROM clanky WHERE clanky_id=?";
$dotaz = $db->prepare($sql);
$dotaz->execute(array($_GET['ID']));
$clanek = $dotaz->fetch(PDO::FETCH_ASSOC);
echo '<p>' . htmlspecialchars($clanek['obsah']) . '</p>';

Je zde použit tzv. parametrizovaný dotaz, což je pro tebe další level. Takový dotaz je totiž bezpečný proti útočníkům. Pokud bys to udělal "klasicky", mohl by ti kdekdo ukrást nebo zdemolovat databázi.

Pokud s databázemi začínáš, doporučuji ti pro názvy tabulek a sloupců používat jednotné číslo. Tabulka by se tedy neměla jmenovat `clanky`, ale `clanek`. Pojmenovává se jeden záznam v tabulce.

Místo `clanek_id` je dobrým zvykem používat pouze název `id`. Tím je automaticky patrné, že se jedná o primární klíč. Název `clanek_id` se pak používá jako název cizího klíče v ostatních tabulkách.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #24
-
0
-

Díky mockrát :). Kdybych dostal oba dva, tak nevím jak bych je rozdělil a nacpal do dvou divů a mezi ty divy strčil ještě nadpis a podobně. Btw. samozřejmě nepoužívam div, jen pro ukázku :).

Nahlásit jako SPAM
IP: 46.135.210.–
Kit+15
Guru
24. 11. 2015   #25
-
0
-

#24 Shark
Však to řeší ten foreach výše. Místo "p" tam dáš "div" a je to. Když budeš chtít 5 článků, tak v SQL napíšeš "LIMIT 5".

Ptáš se střídavě na dvě různé věci: Na výpis seznamu článků a na výpis jednoho článku. Řeší se to dvěma odlišnými způsoby, používají se na to dva různé SQL dotazy a jejich výsledky se také zpracovávají odlišně. Nesnaž se to nacpat do jedné metody.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #26
-
0
-

Ano, kdybych chtěl seznam, tak tám dám místo toho div, ale jak potom mezi každý ten div narvu podobnou funkci, která bude vkládat titulek apod?

Nahlásit jako SPAM
IP: 46.135.210.–
Shark
~ Anonymní uživatel
38 příspěvků
24. 11. 2015   #27
-
0
-

Teď mě to asi napadlo :D. Zítra to zkusím. Každopádně díky za cenné rady a trpělivost :).

Nahlásit jako SPAM
IP: 46.135.210.–
Kit+15
Guru
24. 11. 2015   #28
-
0
-

#26 Shark
Prostě přidáš do selectu další sloupeček: 

<?php
$sql = "SELECT titulek, obsah FROM clanek ORDER BY id DESC LIMIT 2";
foreach ($db->query($sql, PDO::FETCH_ASSOC) as $clanek) {
    echo '<h2>' . htmlspecialchars($clanek['titulek']) . '</h2>';
    echo '<div>' . htmlspecialchars($clanek['obsah']) . '</div>';
}
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Shark
~ Anonymní uživatel
38 příspěvků
25. 11. 2015   #29
-
0
-

Tak teď už je to kompletně vše. Díky moc a omlouvám se za vypadané vlasy :).

Nahlásit jako SPAM
IP: 46.135.217.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Podobná vlákna

WinAVR+C syntaxe — založil Mario1

Chybná syntaxe — založil bohetik

[DB] - špatná syntaxe — založil schimpanze

Syntaxe MatLabu — založil Volumer

Vysvětlení syntaxe — založil brumla

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý