IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Začátečník - rada se sestavením dotazu

Aktivity
Avatar
Jan Novák :31.10.2016 12:01

Ahoj všem

Potřeboval bych radu od zkušenějších. Dostal jsem za úkol vytvořit následující výstup: V databázi mám dvě tabulky - i5dof_phocadow­nload_logging (ta obsahuje seznam souboru a prehled o tom,jaké uživatelské ID stáhlo jaký soubor) a i5dof_users (ta obsahuje seznam uživatelů podle ID a uživatelského jména). Co potřebuji je když zadám jako vstup ID souboru,aby výsledek hledání byl seznam uživatelů, kteří ten soubor stáhnuli. V SQL se nevyznám, zatím se učím opravdové základy a tak složení tohoto dotazu je nad moje síly. Screeny obou tabulek jsou v příloze.
Byl by někdo ochotný poradit prosím?

 
Odpovědět
31.10.2016 12:01
Avatar
Jan Bezdíček
Tvůrce
Avatar
Jan Bezdíček:31.10.2016 12:11
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 :D

Editováno 31.10.2016 12:12
 
Nahoru Odpovědět
31.10.2016 12:11
Avatar
Jan Bezdíček
Tvůrce
Avatar
Jan Bezdíček:31.10.2016 12:18

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
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
31.10.2016 12:18
Avatar
Jan Novák :31.10.2016 12:20

Chlapi děkuju moc. Hned to jdu vyzkoušet a dám vědět.

 
Nahoru Odpovědět
31.10.2016 12:20
Avatar
Jan Novák :31.10.2016 12:28

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.

 
Nahoru Odpovědět
31.10.2016 12:28
Avatar
Jan Novák :31.10.2016 12:32

Tak už jsem na to přišel dotaz funguje správně, jen bylo potřeba WHERE i5dof_phocadow­nload_logging­.id zaměnit za WHERE i5dof_phocadow­nload_logging­.fileid

Děkuju moc za pomoc - záchranu života :)

 
Nahoru Odpovědět
31.10.2016 12:32
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:31.10.2016 12:35

Jo tak ... myslel sem, ze id souboru je logicky jen "id" :D fileid jsem nejak prehlidl ... kazdopadne jsem rad, ze funguje :)

 
Nahoru Odpovědět
31.10.2016 12:35
Avatar
Jan Novák :31.10.2016 12:59

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 :/

 
Nahoru Odpovědět
31.10.2016 12:59
Avatar
Jan Novák :31.10.2016 13:05

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>
 
Nahoru Odpovědět
31.10.2016 13:05
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:31.10.2016 13:32

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 :D uzaviras TD, ktere si ani neotevrel hned na prvnim radku :D

Editováno 31.10.2016 13:33
 
Nahoru Odpovědět
31.10.2016 13:32
Avatar
Odpovídá na Jan Bezdíček
Jan Novák :31.10.2016 13:42

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ů :D

Editováno 31.10.2016 13:43
 
Nahoru Odpovědět
31.10.2016 13:42
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:31.10.2016 13:46
$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

 
Nahoru Odpovědět
31.10.2016 13:46
Avatar
Odpovídá na Jan Bezdíček
Jan Novák :31.10.2016 14:13

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.

 
Nahoru Odpovědět
31.10.2016 14:13
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:31.10.2016 14:15

Jakou mas verzi PHP ?

Koukni se do PHP error logu, najdes ho nekde ve slozce kde mas Apache/PHP

 
Nahoru Odpovědět
31.10.2016 14:15
Avatar
Jan Novák :31.10.2016 14:21

PHP Version 5.5.36

K error logu se nedostanu

Editováno 31.10.2016 14:22
 
Nahoru Odpovědět
31.10.2016 14:21
Avatar
Jan Bezdíček
Tvůrce
Avatar
Jan Bezdíček:31.10.2016 14:29

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

 
Nahoru Odpovědět
31.10.2016 14:29
Avatar
Odpovídá na Jan Bezdíček
Jan Novák :31.10.2016 14:32

Vteřinku...dostanu se k tomu tak za deset minut. Děkuji Ti že si na mne děláš čas

 
Nahoru Odpovědět
31.10.2016 14:32
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:31.10.2016 14:43

Vpohode, neni zac :) rad pomuzu ... mam z toho dobrej pocit a je mi to prijemnejsi nez se nervovat nad vlastnima zdrojakama :D :D kazdopadne sem si vsiml, ze po mysql_select_db(); mas navic jednu zavorku } ... smaz ji

 
Nahoru Odpovědět
31.10.2016 14:43
Avatar
Jan Novák :31.10.2016 14:53

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
 
Nahoru Odpovědět
31.10.2016 14:53
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:31.10.2016 14:57

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.

 
Nahoru Odpovědět
31.10.2016 14:57
Avatar
Jan Novák :31.10.2016 15:08

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

 
Nahoru Odpovědět
31.10.2016 15:08
Avatar
Jan Bezdíček
Tvůrce
Avatar
Jan Bezdíček:31.10.2016 15:17
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

 
Nahoru Odpovědět
31.10.2016 15:17
Avatar
Odpovídá na Jan Bezdíček
Jan Novák :31.10.2016 15:21

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

 
Nahoru Odpovědět
31.10.2016 15:21
Avatar
Odpovídá na Jan Novák
Michal Štěpánek:31.10.2016 18:58

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>');
Nahoru Odpovědět
31.10.2016 18:58
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Jan Novák :3.11.2016 10:32

Díky moc. Už je to správně.

 
Nahoru Odpovědět
3.11.2016 10:32
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 25 zpráv z 25.