Diskuze: Začátečník - rada se sestavením dotazu
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 25 zpráv z 25.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
SELECT i5dof_users.username FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.id=SEM_VLOZ_ID_SOUBORU
Neverim zadnemu dotazu, ktery napisu "na slepo" bez odzkouseni ale ... snad bude fungovat
Ted me jeste napadlo, ze jeden uzivatel mohl ten soubor stahnout vickrat ... v tom pripade, pokud jeho jmeno chces vratit pouze jednou a ne v zavislosti na tom, kolikrat ten soubor stahl, tak na konec muzes jeste pridat GROUP BY
SELECT i5dof_users.username FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.id=SEM_VLOZ_ID_SOUBORU GROUP BY i5dof_users.username
Tak pokud tento dotaz spustim z admina v databazi pokus je výsledek :
MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0008 sec )
SELECT i5dof_users.username
FROM i5dof_users
JOIN i5dof_phocadownload_logging ON ( i5dof_users.id = i5dof_phocadownload_logging.userid )
WHERE i5dof_phocadownload_logging.id =2006
GROUP BY i5dof_users.username
LIMIT 0 , 30
Pokud tedy zadávám správně ID souboru.
Jo tak ... myslel sem, ze id souboru je logicky jen "id" fileid jsem nejak prehlidl ... kazdopadne jsem rad, ze funguje
Tak ještě jeden problém - Tady je kód stránky kde to chci vypsat:
<!DOCTYPE html>
<html lang="cs-cz">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Maji stazeno</title>
</head>
<body>
<h1>Maji stazeno</h1>
<?php
$servername = "localhost";
$username = "root";
$password = "admin";
// Create connection
$conn = mysqli_connect($servername, $username, $password);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$uzivatele = "SELECT i5dof_users.username FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username LIMIT 0, 30 ";
echo('<h2>Uživatelé</h2><table border="1">');
foreach ($uzivatele as $u)
{
echo('</td><td>' . htmlspecialchars($u['userid']));
echo('</td><td>' . htmlspecialchars($u['username']));
echo('</td></tr>');
}
echo('</table>');
?>
</body>
</html>
A nevypíše ani čárku :/
Zkusil jsem to trochu zjednodusit - tady je zdrojový kód:
<!DOCTYPE html>
<html lang="cs-cz">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Maji stazeno</title>
</head>
<body>
<h1>Maji stazeno</h1>
<?php
require_once('Db.php');
Db::connect('127.0.0.1', 'pokus', 'root', 'admin');
}
$uzivatele = Db::queryAll('SELECT i5dof_users.username FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username');
echo('<h2>Uživatelé</h2><table border="1">');
foreach ($uzivatele as $u)
{
echo('</td><td>' . htmlspecialchars($u['username']));
echo('</td><td>' . htmlspecialchars($u['email']));
echo('</td></tr>');
}
echo('</table>');
?>
</body>
</html>
Pouzivas nejaky databazovy wrapper ... nevim jak to funguje v nem, kazdopdne, snazis se vypisovat $u['email'] ale v dotazu jej neselectujes, uprav dotaz na
SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username
a pouziti tech <td> v tom foreach cyklu mas taky nejak zvlastne uzaviras TD, ktere si ani neotevrel hned na prvnim radku
Takhle je to bez wrapperu a po uprave a stale nic:
<!DOCTYPE html>
<html lang="cs-cz">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Maji stazeno</title>
</head>
<body>
<h1>Maji stazeno</h1>
<?php
$myhostName="localhost";
$mydbName="pokus";
$myuserName="root";
$myPW="admin";
$connection = mysql_connect($myhostName,$myuserName,$myPW);
mysql_select_db($mydbName,$connection);
}
$uzivatele = ("SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username\n" . " LIMIT 0, 30 ");
echo('<h2>Uživatelé</h2><table border="1">');
foreach ($uzivatele as $u)
{
echo('</td><td>' . htmlspecialchars($u['username']));
echo('</td><td>' . htmlspecialchars($u['email']));
echo('</td></tr>');
}
echo('</table>');
?>
</body>
</html>
Co se týká té tabulky - ta je okopírovaná z jednoho ze zdejších tutoriálů
$uzivatele = ("SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username\n" . " LIMIT 0, 30 ");
Tohle neposle zadny MYSQL dotaz, jen ulozi jako string do promenne
Pouzij kod takto:
$uzivatele = mysql_query("SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username");
while ($u = mysql_fetch_assoc($uzivatele))
{
echo('<tr><td>' . htmlspecialchars($u['username']));
echo('</td><td>' . htmlspecialchars($u['email']));
echo('</td></tr>');
}
Kazdopadne, nepuzivej na konci dotazu klauzuli LIMIT, orezava to pocet vysledku na 30, coz urcite nechces (kdyby si ten soubor stahlo vic nez 30 lidi) a taky bys nemel pouzivat databazove funkce mysql_, je to tzv. "deprecated" a v PHP 7 uz to dokonce neni, takze by ti pod PHP 7 tenhle kod nebezel
Tak jsem kod upravil a stále nic. Dokonce mi teď načítání stránky skončí na statusu 500 a stránka se nenačte.
Jakou mas verzi PHP ?
Koukni se do PHP error logu, najdes ho nekde ve slozce kde mas Apache/PHP
A kdyz das tohle na zacatek skriptu ?
error_reporting(E_ALL);
ini_set('display_errors', 1);
popripade jeste hod na pastebin.com ten tvuj aktualni kod jak ted je
Vteřinku...dostanu se k tomu tak za deset minut. Děkuji Ti že si na mne děláš čas
Vpohode, neni zac rad pomuzu ... mam z toho dobrej pocit a je mi to prijemnejsi nez se nervovat nad vlastnima zdrojakama kazdopadne sem si vsiml, ze po mysql_select_db(); mas navic jednu zavorku } ... smaz ji
Tak po odstranění závorky :
Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /share/MD0_DATA/Qweb/joomlaCMS/test/index.php on line 20
[email protected]@nova-design.cz
Presne co jsem rikal, mysql_ nepouzivat ... inspiruj se timhle a prepis dle toho tvuj zdrojak
http://www.w3schools.com/…ch_assoc.asp
Je tam pripojeni k DB, poslani dotazu a vypsani vysledku pomoci mysqli driveru. Ten lze pouzit.
Takže verze po úpravě :
<!DOCTYPE html>
<html lang="cs-cz">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Registrace uživatele</title>
</head>
<body>
<h1>Registrace uživatele</h1>
<?php
$con=mysqli_connect("localhost","root","admin","pokus");
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql="SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username";
$uzivatele = mysqli_query($con,$sql);
while ($u = mysqli_fetch_assoc($uzivatele))
{
echo('<tr><td>' . htmlspecialchars($u['username']));
echo('</td><td>' . htmlspecialchars($u['email']));
echo('</td></tr>');
}
mysqli_close($con);
?>
</body>
</html>
A stránka zobrazí pouze nadpis
SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username
Napada me jedine, ze v tom dotazu mas mezeru ... i5dof_users .id prepis na i5dof_users.id
Ano, to bylo ono
Teď už to vypisuje. Sice do řádku a ne do tabulky, ale s tím už si snad
nějak poradím
Jěště jednou děkuju za ochotu, pomoc a Tvůj čas.
Díky Honza
Do řádku to vypisuje, protože tam musíš ještě před začátkem cyklu uvést tu tabulku a po skončení cyklu ji zase uzavřít...
echo('<table>');
while ($u = mysqli_fetch_assoc($uzivatele))
{
echo('<tr><td>' . htmlspecialchars($u['username']));
echo('</td><td>' . htmlspecialchars($u['email']));
echo('</td></tr>');
}
mysqli_close($con);
echo('</table>');
Zobrazeno 25 zpráv z 25.