Avatar billede rotco Juniormester
20. november 2013 - 01:14 Der er 5 kommentarer

Samlet num rows af flere tabeller (MySQL & PHP)

Hejsa,

Ja, jeg har faktisk forsøgt at finde svaret på det her på Google, men jeg har åbenbart overvurderet mine evner til at søge, idet jeg ikke kan finde det jeg leder efter.

Jeg skal bruge den samlede sum af antal uploads for en bestemt bruger. Jeg ved godt at num_rows udgår, og at jeg bør skifte til iMySQL, hvilket jeg lige er i gang med at lære.

Anyway. Jeg kunne godt tænke mig at få følgende kode (og 4 forespørgseler), kortet ned til kun én forespørgsel.

//Videoer
$result1 = mysql_query("SELECT * FROM videoer WHERE medlems_id = '".$_GET['mid']."'");
$num_rows1 = mysql_num_rows($result1);
//Billeder
$result2 = mysql_query("SELECT * FROM billeder WHERE medlems_id = '".$_GET['mid']."'");
$num_rows2 = mysql_num_rows($result2);
//Spil
$result3 = mysql_query("SELECT * FROM spil WHERE medlems_id = '".$_GET['mid']."'");
$num_rows3 = mysql_num_rows($result3);
//Artikler
$result4 = mysql_query("SELECT * FROM artikler WHERE medlems_id = '".$_GET['mid']."'");
$num_rows4 = mysql_num_rows($result4);

$UploadSum = ($num_rows1+$num_rows2+$num_rows3+$num_rows4);

echo $UploadSum;
Avatar billede arne_v Ekspert
20. november 2013 - 01:40 #1
proev:

$sql = "SELECT SUM(n) FROM("
    . "SELECT COUNT(*) AS n FROM videoer WHERE medlems_id = '" . $_GET['mid'] . "'"
    . " UNION ALL "
    . " SELECT COUNT(*) AS n FROM billeder WHERE medlems_id = '" . $_GET['mid'] . "'"
    . " UNION ALL "
    . " SELECT COUNT(*) AS n FROM spil WHERE medlems_id = '" . $_GET['mid'] . "'"
    . " UNION ALL "
    . " SELECT COUNT(*) AS n FROM atikler WHERE medlems_id = '" . $_GET['mid'] . "'"
    . ") x";
$res = mysql_query($sql);
$sum = mysql_result($res, 0, 0);
Avatar billede arne_v Ekspert
20. november 2013 - 01:41 #2
Og husk at faa laest omkring SQL injection og mere moderne database API'er.
Avatar billede rotco Juniormester
20. november 2013 - 01:46 #3
FANTASTISK arne_v !! Ja, men hvis jeg nu skifter til MySQLi så er den mere sikker - ikke?

I så fald, hvordan kan overstående kode skrives i MySQLi? Hvis såfremt du vil hjælpe mig, jeg vil jo gerne lave den sikreste og bedste kode, som ikke udgår lige foreløbig.

Jeg har en masse at foretage mig, idet at jeg har et stort CMS i alm. MySQL, som skal skiftes over til MySQLi. Pyyh :)

Mange tak indtil videre, jeg vil dog værdsætte hvis du også kunne forklare koden i MySQLi.

Kom bare med et svar :)
Avatar billede arne_v Ekspert
20. november 2013 - 01:59 #4
Noget a la:

$sql = "SELECT SUM(n) FROM("
    . "SELECT COUNT(*) AS n FROM videoer WHERE medlems_id = ?"
    . " UNION ALL "
    . " SELECT COUNT(*) AS n FROM billeder WHERE medlems_id = ?"
    . " UNION ALL "
    . " SELECT COUNT(*) AS n FROM spil WHERE medlems_id = ?"
    . " UNION ALL "
    . " SELECT COUNT(*) AS n FROM atikler WHERE medlems_id = ?"
    . ") x";
$stmt = mysqli_prepare($sql);
mysqli_stmt_bind_param($stmt, "iiii", $_GET['mid'], $_GET['mid'], $_GET['mid'], $_GET['mid']);
$res = mysqli_stmt_get_result($stmt);
$data = mysqli_fetch_all($res);
$sum = $data[0][0];
Avatar billede erikjacobsen Ekspert
20. november 2013 - 08:24 #5
En lille præcisering: Det er ikke mere sikkert at skifte til mysqli (og tilsvarende), hvis du fortsætter med at indsætte værdier med streng-sammensætning

  "SELECT ... " . $_GET['mid'] . " ... "

Det er kun mere sikkert, hvis du gør som i #4 og indsætter værdierne med mysqli_stmt_bind_param (og tilsvarende).

Og så er det ikke kun SQL-injection du skal tænke på i forbindelse med sikkerhed i databaser - det er bare så trivielt nemt at undgå.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester