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 '`'
Fórum › PHP
Chyba syntaxe
<?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");
?>
#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.
#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ší,...
#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?
#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>';
}
#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é.
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 :).
#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.
#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.
#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>';
}
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
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
Moderátoři diskuze