Diskuze: SQL dotaz na zobrazenie vsetkych clankov autorov, pricom pre kazdeho je nastaveny limit poctu clankov
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 8 zpráv z 8.
//= 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.
Ahoj,
šel bych na to asi nějak takto:
(
SELECT title, article
FROM articles
WHERE user = peter
LIMIT 5
)
UNION
(
SELECT title, article
FROM articles
WHERE user = alfons
LIMIT 8
)
UNION
(
SELECT title, article
FROM articles
WHERE user = bohumil
LIMIT 14
)
ORDER BY date DESC
A klidne to muzes udelat i bez union, jednotlivymi dotazy a v cyklu jen menit jmeno a pocet.
No len ako by vyzeral ten cyklus, myslim menit meno a pocet v cyklu ?
Tady máš nástin jedné z možností, jak by mohl vypadat ten cyklus v php.
/**
* funkce wacejicí výsledky z db jako pole
* @return array
*/
function getDbResults(): array {
// imlmentaci si předpokládám doplníš sám ..
}
$limits = [ // limity pro jenotlivé autory
'author_1' => 10,
'author_2' => 20,
'author_3' => 30,
'author_4' => 40
];
$results = [];
foreach ($limits as $author => $limit) {
$sql = 'SELECT * FROM articles WHERE author = ' . $author . ' LIMIT ' . $limit;
$results += getDbResults();
}
// dále zpracuji výsledky dle pořeby
// $sql = 'SELECT * FROM articles WHERE author = ' . $author . ' LIMIT ' . $limit;
$query = "SELECT * FROM articles WHERE id_author = %s LIMIT %s";
$query = sprintf($query,
escapeSql($author, 'int'),
escapeSql($limit, 'int')
// coz muze byt: (int) $value, v pripade stringu "'".preg_replace('~[']~', "\\'", $value) . "'"
// ale spravne bys mel pouzit funkce primo z sql driveru, prepare statement nebo na escapovani
);
Stacilo by pouzit google, ten je prikladu plny.
A tez by bylo dobre pouzivat spravne nazvy promennych. sql neni totez jako
query.
$sql = 'SELECT * FROM articles WHERE author = ' . $author . ' LIMIT ' . $limit;
$query = "SELECT * FROM articles WHERE id_author = %s LIMIT %s";
$query = sprintf($query,
escapeSql($author, 'int'),
escapeSql($limit, 'int')
// coz muze byt: (int) $value, v pripade stringu "'".preg_replace('~[']~', "\\'", $value) . "'"
// ale spravne bys mel pouzit funkce primo z sql driveru, prepare statement nebo na escapovani
);
No len pouzivam PDO z online kurzu MVC cms , autor bude samozrejme id,
'int'
S tymto zapisom sa este nestretol, mam k tomu zopar otazok:
/**
* funkce wacejicí výsledky z db jako pole
* @return array
*/
function getDbResults(): array {
// tu bude vystup pole v zapise? napr.
return $results['clanok_id'];
//alebo ?
echo $results['clanok_id'].'-'.$results['autor_meno'];
}
$limits = [ // limity pro jenotlivé autory
'author_1' => 10,
'author_2' => 20,
'author_3' => 30,
'author_4' => 40
];
$results = []; // premenna je pole obdobny zapis by mal byt zrejme: $results=array();
foreach ($limits as $author => $limit) {
$sql = 'SELECT * FROM articles WHERE author = ' . $author . ' LIMIT ' . $limit;
$results += getDbResults();// vygeneruje zaradom vsetky sql dotazy
}
// dále zpracuji výsledky dle pořeby
$results = []; // premenna je pole obdobny zapis by mal byt zrejme: $results=array();
foreach ($limits as $author => $limit) {
$sql = 'SELECT * FROM articles WHERE author = ' . $author . ' LIMIT ' . $limit;
$results += getDbResults();// vygeneruje zaradom vsetky sql dotazy
}
//---
$results = array();
foreach ($limits as $author => $limit) {
$query = 'SELECT * FROM articles WHERE author = ' . $author . ' LIMIT ' . $limit;
$results += getDbResults($query);
}
getDbResults($query) - to bylo podle mne mysleno symbolicky, ani se nenamahal to dopsat. A ty to stejne nahradis vlastnim zpusobem zapisu.
Ja treba ted pouzivam vlastni class WS, ktera vraci array.
$results += $ws->getArticlesByAuthorId( array('id'=>$author, 'limit'=>$limit) );
// function ($opt=array(), $format=''), format je array, json, xml, csv, txt
Cili, na sql dotazy mam spesl class, a mnohem lepe se pak edituji jako celek v jednom. Navic mi ta class dokaze generovat ruzne formaty, takze vystup muzu zrovna pouzit pro javascript nebo excel (csv) nebo jinam. A soucasne class zkontroluje i opravneni uzivatele. Pak obsahuje prikazy pro nacteni uzivatele z ldap. Cili, nejenom sql. A tez treba ciselniky z textovych souboru a jine.
Zobrazeno 8 zpráv z 8.