Avatar billede hist Praktikant
22. august 2015 - 15:35 Der er 18 kommentarer og
1 løsning

hvordan blander jeg de her to db forespørgsler

hvordan blander jeg de her db forgspørgsler ?
$query = mysql_query("SELECT * FROM billedegallerikommentar where profilerID='".$_GET['id']."' AND billedeID ='".$_GET['pictureID']."' ORDER BY dato DESC limit $s,$pr_side") or die(mysql_error());

print '<table width="495" border="0" align="center" cellpadding="0" cellspacing="0" class="border"><tr>';

while($row = mysql_fetch_array($query)) {
    $findbruger = mysql_query("SELECT * FROM profiler where ID='".$row['senderID']."'") or die(mysql_error());
    $findbrugerinfo = mysql_fetch_array($findbruger);
Avatar billede olsensweb.dk Ekspert
22. august 2015 - 16:28 #1
uden at kende dine data og collonne navne er her et hurtigt gæt
(utested)

$sql = "SELECT billedegallerikommentar.*, profiler.*
FROM billedegallerikommentar
JOIN profiler ON profiler.ID=$_GET['id']
where profilerID='".$_GET['id']."' AND billedeID ='".$_GET['pictureID']."' ORDER BY dato DESC limit $s,$pr_side";

jeg gætter på at profiler.ID=$_GET['id']
kunne der være navne sammenfald af collonner i de 2 tabeller ?

du har et problem der er meget størrer en at sammenlægge dine 2 sql sætninger!!

du anvender det gamle API hvilke bliver fjernet fra PHP med næste vertion der kommer med udgangen af året,
hvilke jeg også skrev til dig i http://www.eksperten.dk/spm/1005398 #4

mysql_query, mysql_fetch_array, mysql_error og alle andre functioner startende med mysql_ virker ikke med næste vertion af PHP

din code er piv åben over for sql injection,  brug aldrig $_GET / $_POST / $_REQUEST direkte i sql, udefra komende værdier skal altid valideres serverside
Avatar billede hist Praktikant
22. august 2015 - 17:00 #2
Tak igen ronols
Ja jeg ved godt den er piv åben men først koncentrere jeg mig lige om at få siden færdig så jeg kan se hvordan den virker og så ved jeg at at jeg skal igang med at stikkere den ;D

forresten hvor mange "db'er" kan man includere i inner join?

hvordan kommer jeg udover det problem med flere id ?
Avatar billede olsensweb.dk Ekspert
22. august 2015 - 17:41 #3
>men først koncentrere jeg mig lige om at få siden færdig så jeg kan se hvordan den virker og så ved jeg at at jeg skal igang med at stikkere den ;D
du kan lige så godt lave det i mysqli eller PDO med det sammen, ellers bliver det dobbelt arbejde, og du får meget travlt, når din host opgraderer, da ingen db ting virker mere !!!

>forresten hvor mange "db'er" kan man includere i inner join?
hvis du merer connections er svaret 1
hvis mener databaser.tabeller, tja så mange du kan overskue, jeg har været opppe at joine 8 tabeller sammen. (her skal man holde tungen lige i munden)
hvis du joiner flere databaser sammen skal de have sammen database brugernavn/password, og ligge på sammen server

>hvordan kommer jeg udover det problem med flere id ?
aliAS et eks http://www.w3schools.com/sql/sql_alias.asp
Avatar billede arne_v Ekspert
22. august 2015 - 20:28 #4
MySQL limit paa max antal tabeller i join er 61 ifoelge dokumentationen.

:-)
Avatar billede olsensweb.dk Ekspert
22. august 2015 - 21:35 #5
ok jeg havde ikke lige slået det op :) , "men jeg tror ikke jeg når den limit" :) , sql udtrykket var rimeligt komplex med 'bare' 8 tabeller

jeg prøvede lige at slå det op
https://dev.mysql.com/doc/refman/5.7/en/joins-limits.html

ja jeg ved godt Bill Gates skulle have sagt sammen om 640K grænsen ifm DOS, så man skal aldrig sige aldrig
ref http://www.computerworld.com/article/2534312/operating-systems/the--640k--quote-won-t-go-away----but-did-gates-really-say-it-.html
Avatar billede hist Praktikant
23. august 2015 - 17:24 #6
nå nu når vi snakker om mysqli osv så kan jeg sku ikke få det til at virke.
værken i version 5.6 eller 7.0

$dsn = 'mysql:host=mysql11.gigahost.dk;db=db';
$username = 'bruger';
$password = 'kode';
$options = array(
  PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);

$dbh = new PDO($dsn, $username, $password, $options);


heller ikke

$id = htmlspecialchars($_GET["id"]);
$stmt=$mysqli->prepare('SELECT * FROM  profiler WHERE id="'.$id.'"') or die(mysqli_error());
Avatar billede arne_v Ekspert
23. august 2015 - 19:17 #7
Det foerste er PDO ikke mysqli.

Det andet misser hele pointen med prepare hvor der skal bruges en parameter markoer som skal saettes efter prepare.
Avatar billede hist Praktikant
28. august 2015 - 09:11 #8
Ved godt det her spørgsmål er over men har lige et spørgsmål til.
jeg kan godt åbne et nyt hvis der er ?

men hvordan kæder jeg 4 db'er/tabeller sammen. har prøvet lidt men kan sku ikke helt fange den :(

$sqlliste = mysql_query("SELECT blockliste.*,profiler.*,plusprofiler.*,profilbilleder.*
INNER JOIN
blockliste on blockliste.profilerID = profiler.ID

where profiler.ID='".$_SESSION['ID']."' ORDER BY blockliste.dato DESC limit $s,$pr_side") or die(mysql_error());

Angåene den gamle API så ved jeg godt det bliver dobbelt arbejde for mig, men jeg kan styre hvilken version af php jeg køre på det pågældende domaine så har lidt ekstra tid til at få lavet den om :D
men helt sikkert det skal da laves om
Avatar billede olsensweb.dk Ekspert
28. august 2015 - 10:17 #9
>men hvordan kæder jeg 4 db'er/tabeller sammen. har prøvet lidt men kan sku ikke helt fange den :(
hvis tabellerne ligger i sammen database, så er det meget let, simpel JOIN's

hvis tabellerne ligger i forskællige databaser, skal du angive databasenavnet foran tabel navnet (db.tbl), her kan det nok anbefales at bruge aliAS, ellers bliver linjen meget lang
nb de forskællige baser skal ligge på sammen server og have sammen brugernavn/password

utested

$sqlliste = mysql_query("SELECT db1.blockliste.*,db2.profiler.*,db3.plusprofiler.*,db4.profilbilleder.*
INNER JOIN blockliste on db1.blockliste.profilerID = db4.profiler.ID
her skal du joine de andre databaser.tabeller
where db4.profiler.ID='".$_SESSION['ID']."' ORDER BY db1.blockliste.dato DESC limit $s,$pr_side") or die(mysql_error());


ref https://www.google.com/search?q=mysql+join+databases
http://stackoverflow.com/questions/5698378/mysql-join-between-tables-in-2-different-databases

ref https://www.google.com/search?q=mysql+join+3+databases
http://stackoverflow.com/questions/3709560/mysql-join-three-tables
http://stackoverflow.com/questions/16013364/inner-join-with-3-tables-in-mysql
http://stackoverflow.com/questions/16222097/mysql-left-join-3-tables

ref https://www.google.com/search?q=mysql+join+databases+different+servers
(tror ikke det er relevant)
http://stackoverflow.com/questions/11114197/join-tables-from-two-different-server
http://stackoverflow.com/questions/810349/mysql-cross-server-select-query
Avatar billede hist Praktikant
28. august 2015 - 13:11 #10
forstå det sku stadig ikke :(

men det her virker

$sqlliste = mysql_query("SELECT *
FROM blockliste
INNER JOIN profiler on blockliste.blockID=profiler.ID

where profilerID='".$_SESSION['ID']."' ORDER BY dato DESC limit $s,$pr_side") or die(mysql_error());

men lige så snart jeg vil have profilbilleder ind hvor
INNER JOIN profilbilleder on blockliste.blockID= profilbilleder.profilerID

så knække r filmen så kommer der fejl

kunne heller ikke få det forslag til at funger som du kom med op over ronols
Avatar billede hist Praktikant
28. august 2015 - 13:35 #11
Det er ca. det jeg skal bruge fra de databaser/tabeller ved ikke hvad det hedder

blockliste (blockID,dato)
profiler (profilnavn,kon)
plusprofiler (profilerID,kode)
profilbilleder (billede,profilerID,godkendt)
Avatar billede olsensweb.dk Ekspert
28. august 2015 - 14:11 #12
vi har ingen jordisk chance for at vide hvordan dine tabeller skal joines sammen når vi ikke kender din database tabeller /databaser tabeller.

hvis vi skal komme med et forslag til en join af de 4 tabeller, skal vi vide hvordan de er bygget op (tabel navne, collonne navne)
lav et sql dump af de 4 tabeller og et E/R diagram, hvis man ikke kan se i sql dumpet hvordan tabellerne hænger sammen (der er lavet relationer i databasen, logiske collonne navne)
begræs gerne tabellen til 3 personer, hvis der er pw i så anvend dummy data

læg mærke til allerede i #1 skrev jeg gæt, da jeg ikke aner hvordan de er knyttet sammen

læg det evt op på dit domain så vi kan hente det.

link:
ref https://www.google.com/search?q=mysql+join
https://dev.mysql.com/doc/refman/5.7/en/join.html

ref https://www.google.com/search?q=mysql+join+two+tables
https://dev.mysql.com/doc/refman/5.7/en/multiple-tables.html
http://www.w3schools.com/sql/sql_join.asp
http://www.mysqltutorial.org/mysql-inner-join.aspx


ellers luk spm her og opret et nyt, så der kan komme friske input.
læg gerne et link til det nye spm i dette spm, så folk der læser det senere hen kan følge det.
Avatar billede hist Praktikant
28. august 2015 - 17:49 #13
Ja jeg ved godt det er ikke lige de bedste vilkår i får at arbejde med :D
men fik det her til at virke på nær at hvis profilen ikke har profilbillede så bliver den ikke vist og det skulle den gerne.


$sqlliste = mysql_query("SELECT blockliste.blockID, blockliste.dato, profiler.ID, profiler.profilnavn, profiler.kon, profilbilleder.billede, plusprofiler.profilerID, plusprofiler.kode
FROM blockliste
INNER JOIN profiler on blockliste.blockID=profiler.ID
JOIN profilbilleder on blockliste.blockID=profilbilleder.profilerID
JOIN plusprofiler
where blockliste.profilerID='".$_SESSION['ID']."' ORDER BY blockliste.dato DESC limit $s,$pr_side") or die(mysql_error());
Avatar billede olsensweb.dk Ekspert
28. august 2015 - 19:11 #14
>hvis profilen ikke har profilbillede så bliver den ikke vist og det skulle den gerne.
kunne være du skulle kigge lidt på forskellen mellem
(INNER) JOIN
LEFT JOIN
RIGHT JOIN

>JOIN plusprofiler
skulle vel joines på et eller andet ikk ??
Avatar billede hist Praktikant
29. august 2015 - 07:22 #15
hold da op
du styre bare alt det der php med hård hånd ronols super tak igen.
kom med et svar så der point igen :D
Avatar billede hist Praktikant
29. august 2015 - 07:22 #16
sådan her kom det til at virke som det skulle

$sqlliste = mysql_query("SELECT blockliste.blockID, blockliste.dato, profiler.ID, profiler.profilnavn, profiler.kon, profilbilleder.billede, plusprofiler.profilerID, plusprofiler.kode
FROM blockliste
INNER JOIN profiler on blockliste.blockID=profiler.ID
left JOIN profilbilleder on blockliste.blockID=profilbilleder.profilerID
left JOIN plusprofiler on blockliste.blockID=plusprofiler.profilerID
where blockliste.profilerID='".$_SESSION['ID']."' ORDER BY blockliste.dato DESC limit $s,$pr_side") or die(mysql_error());
Avatar billede olsensweb.dk Ekspert
29. august 2015 - 10:03 #17
>kom med et svar så der point igen :D
får du her

også er det igang med at lave det om til mysqli eller PDO

i mysqli kan du skrive produralt style som du kender det fra det gamle API (ligner det gamle 99%) eller OOP style, eller blande de 2 styles.



i PDO kan du kun skrive OOP style.
Avatar billede hist Praktikant
29. august 2015 - 14:45 #18
rode lidt med mysqli men det fuckede helt op såblev enige med med mig selv om at vente med at lave det om, til jeg var færdig med at oversætte.
(ved godt det er dobbel arbejde men så lære jeg lidt ;) )
Den skal også finpusses når jeg er færdig så det passe fint at jeg kan lave det om der :D
Avatar billede olsensweb.dk Ekspert
30. august 2015 - 08:31 #19
>(ved godt det er dobbel arbejde men så lære jeg lidt ;) )
spild af tid

Forskellen er ikke så stor, hvis vi undlader at anvende prepare statement, som var en af de nye ting i mysqli og klart forbedret i PDO

alt code er utested

ligger lige din sql ud i en seperat variabel, da jeg ikke gider gentage den flere gange


$sql = "SELECT blockliste.blockID, blockliste.dato, profiler.ID, profiler.profilnavn, profiler.kon, profilbilleder.billede, plusprofiler.profilerID, plusprofiler.kode
FROM blockliste
INNER JOIN profiler on blockliste.blockID=profiler.ID
left JOIN profilbilleder on blockliste.blockID=profilbilleder.profilerID
left JOIN plusprofiler on blockliste.blockID=plusprofiler.profilerID
where blockliste.profilerID='".$_SESSION['ID']."' ORDER BY blockliste.dato DESC limit $s,$pr_side";


det gamle API
   
$sqlliste = mysql_query($sql) or die(mysql_error());
// $sqlliste = mysql_query($sql, $conn) or die(mysql_error($conn));


connect data
   
$db = "test";
$hostname = "localhost";
$username="my_user";
$password="my_password";


mysqli, du kan blande procedural style og OOP style, men det mest effektive er OOP style, da procedural style bare kalder tilsvarende metode i OOP style
  
// connect
$conn = mysqli_connect($hostname, $username, $password, $db); // procedural style
//$conn = new mysqli($hostname, $username, $password, $db); // OOP style

$sqlliste = mysqli_query($conn, $sql) or die(mysqli_error($conn)); // procedural style
// $sqlliste = $conn->query($sql) or die($conn->error); // OOP style


pdo
   
$conn = new PDO("mysql:host=$hostname;dbname=$db;charset=utf8", $username, $password);
$sqlliste = $conn->query($sql) or die(var_export($conn->errorinfo(), TRUE));


så skal det efterfølgende sql også laves om :), så du fetcher med det rigtige API
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

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