Toon posts:

[PHP] Probleem met uitlezen van SQL query?

Pagina: 1
Acties:
  • 45 views sinds 30-01-2008

Verwijderd

Topicstarter
Korte situatie schets:

Ik heb een MySQL database met twee tabellen; contract en contract_party.
Ik wil vanuit een Webformulier (HTML, PHP) een contract kunnen toevoegen, waarbij ik drie contractors kan kiezen (waarmee het contract afgesloten is) vanuit de tabel contract_party. Dit heb ik gerealiseerd in de vorm van drie drop-down boxes die gepopuleerd worden.
Ik heb een relatie tussen deze tabellen opgezet; contract.party1 = contract_party.id, contract.party2 = contract_party.id en contract.party3 = contract_party.id.

Het toevoegen werkt dan ook en de verschillende attributen worden aan de database toegevoegd d.m.v.:

PHP:
1
2
3
4
5
6
7
8
9
$sql = "INSERT INTO contract SET
              id = '$_POST[newcid]',
              party1 = '$_POST[newcp1]',
              party2 = '$_POST[newcp2]',
              party3 = '$_POST[newcp3]',
              remarks = '$_POST[newcremarks]'";
    if (!mysql_query($sql))
        error('A database error occurred in processing your '.
              'submission: ' . mysql_error());


Vervolgens wil ik de namen laten zien van de contractors van de instantie die zojuist is toegevoegd, maar dat krijg ik niet voor elkaar; het resultaat blijft leeg? Ik heb de volgende SQL query gemaakt, maar volgens mij klopt die niet:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$result = mysql_query("SELECT * FROM contract, contract_party WHERE contract.party1=contract_party.id AND contract.party2=contract_party.id AND contract.party3=contract_party.id AND contract.type=contract_type.id AND contract.id = '$_POST[newcid]'");

 if (!$result) {
error('A database error occurred in processing your submission: ' . mysql_error());
}

$myrow = mysql_fetch_array($result);
        
$remark = $myrow['remarks'];
$keydisc = $myrow['keydisc'];   
$remarkpb = wordwrap($remark, 80, "<br>", 1);
$keydiscpb = wordwrap($keydisc, 80, "<br>", 1);

echo "<table id=\"table\"><tr><td>Contract Party 1</td><td id=\"result\"><b>".$myrow['contract_party.name']."</b></td></tr>";
echo "<table id=\"table\"><tr><td>Contract Party 2</td><td id=\"result\"><b>".$myrow['contract_party.name']."</b></td></tr>";
echo "<table id=\"table\"><tr><td>Contract Party 3</td><td id=\"result\"><b>".$myrow['contract_party.name']."</b></td></tr>";


In het bovenstaande stuk code vraag ik drie keer $myrow['contract_party.name'] op...Ik denk dat dit niet kan???

Ziet iemand waar de fout zit of heeft iemand een veel beter idee om dit te realiseren?
Alvast bedankt voor de hulp!

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 14:31

DizzyWeb

Ondertiteld

Als ik jou was zou ik eens een tutorialtje over php en mysql gaan opzoeken, want no offence, je queries kloppen van geen kanten en je gebruikt je arrays ook verkeerd. Waarom gebruik je op de ene plek wel netjes $myrow['remarks'] en zet je in je query $_POST[newcid] neer?

Verder begrijp ik niet goed wat je precies probeert te doen, maar er loopt denk ik ook iets mis in je logica. Je probeert nu dezelfde tabel 3x te gebruiken, Je zegt nu in feite dat 1 veld 3 verschillende waarden moet hebben, wat nooit kan, dus je zal altijd 0 regels terug krijgen.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

En wat blijft er nu leeg? Krijg je geen result terug? Zo ja, kijk dan naar de mysql_error().
Of blijft $myrow['contract_party.name'] leeg?
Je zou dan eens kunnen proberen om de table naam weg te halen op deze manier: $myrow['name'].

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Zet dit eens in je code, dan zie je meteen wat er fout gaat:
PHP:
1
print_r($myrow);

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

je kan volgens mij sowiezo beter niet '$_POST[newcid]' dit zo in je query plempen, bij mij gaf dat nogal eens problemen... btr
...value='".$_POST[newcid]."'"
of gewoon opslaan in een normale variabele, en dan in de query

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 22:20

ripexx

bibs

Verwijderd schreef op woensdag 11 mei 2005 @ 19:16:
je kan volgens mij sowiezo beter niet '$_POST[newcid]' dit zo in je query plempen, bij mij gaf dat nogal eens problemen... btr
...value='".$_POST[newcid]."'"
of gewoon opslaan in een normale variabele, en dan in de query
Ach, hoe je de string concat is niet zo zeer het probleem, maar om direct een POST var in een query te plempen vraagt om problemen. SQL injection enzo ;)

buit is binnen sukkel


Verwijderd

Topicstarter
DizzyWeb schreef op woensdag 11 mei 2005 @ 17:13:
Als ik jou was zou ik eens een tutorialtje over php en mysql gaan opzoeken, want no offence, je queries kloppen van geen kanten en je gebruikt je arrays ook verkeerd. Waarom gebruik je op de ene plek wel netjes $myrow['remarks'] en zet je in je query $_POST[newcid] neer?
Omdat de query alleen het zojuist aangemaakte contract dient te selecteren. Ik selecteer dus op het nieuwe contract id dat bij het versturen van het formulier is aangemaakt. ($_POST[newcid]... )
Verder begrijp ik niet goed wat je precies probeert te doen, maar er loopt denk ik ook iets mis in je logica. Je probeert nu dezelfde tabel 3x te gebruiken, Je zegt nu in feite dat 1 veld 3 verschillende waarden moet hebben, wat nooit kan, dus je zal altijd 0 regels terug krijgen.
Ik was er ook al achter dat het zo inderdaad niet kan nee, maar mijn vraag was/is of iemand mij advies kan geven over hoe het wel kan?

Wat ik globaal probeer te doen is dus een webformulier te maken met drie drop-down boxes erop.
In alledrie de dropdown boxes zitten dezelfde waardes waaruit je kan kiezen; De namen van bedrijven waar een contract mee is afgesloten. Deze namen komen uit de tabel 'contract_party'. Bij het versturen van het formulier worden de sleutels die bij deze namen horen opgeslagen in de tabel 'contract'. Dit gaat ook goed.
Vervolgens wil ik (na het formulier verstuurd te hebben) een overzichtje weergeven met het zojuist toegevoegd contract, maar hier wil ik niet de sleutels weergeven, maar de namen die bij deze sleutels horen (contract_party.name). De relaties tussen deze tabellen zien er als volgt uit:

Tabel Contract:
- id (Primary Key)
- Party1 (Foreign key: contract_party.id)
- Party2 (Foreign key: contract_party.id)
- Party3 (Foreign key: contract_party.id)
rest...

Tabel Contract_party:
- id (Primary Key)
- Name
rest...

Is dit te realiseren via een SQL query of moet ik het helemaal anders aanpakken? Databasetechnisch? Misschien een koppeltabel? Hopelijk iets duidelijker nu?

Verwijderd

Topicstarter
-NMe- schreef op woensdag 11 mei 2005 @ 17:33:
Zet dit eens in je code, dan zie je meteen wat er fout gaat:
PHP:
1
print_r($myrow);
Blijft leeg?

print_r($result); Is niet leeg, geen error...

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Zet je select query eens in een aparte variabel en controleer de waarde ervan door hem uit te printen. Overigens is het verstandig om je queries netjes te structureren, dan zie je fouten veel sneller en zijn ze ook nog eens gemakkelijker op te lossen. Concat je $_POST vars eens op een nette manier en gebruik dan gelijk mysql_real_escape_string() om problemen te voorkomen. Je kunt overigens met mysql_num_rows() controleren of er wel een rij is opgehaalt en hoeveel.

Noushka's Magnificent Dream | Unity


  • Nick The Heazk
  • Registratie: Maart 2004
  • Laatst online: 07-09-2024

Nick The Heazk

Zie jij er wat in?

Het is misschien aan te raden om je query eens te draaien met SQL. Dan kun je meteen zien of hij wel selecteert wat jij wilt. Al vermoed ik dat je weinig rijen gaat vinden die 3x de waarde "contract_party.id" zijn. Dat wil dan toch zeggen dat je de 3 Parties selecteerd (of is er nog code die ontbreekt)?

Performance is a residue of good design.


Verwijderd

Topicstarter
De query slaat eerst de id's van die drie Parties op, vervolgens wil ik de namen die bij deze id's horen weergeven d.m.v. een SQL query...

  • Nick The Heazk
  • Registratie: Maart 2004
  • Laatst online: 07-09-2024

Nick The Heazk

Zie jij er wat in?

Dan vrees ik dat je query verkeerd is. Want zoals ik de query lees kan je enkel een result hebben als de 3 Parties dezelfde zijn. (je gebruikt AND). Ik denk dat je eerder moet kijken wat deze contract_party is. Niet of ze allemaal tegelijkertijd aan hetzelfde gelijk zijn.

Performance is a residue of good design.


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
jij zegt (ergens) dat partyid 1 moet zijn.
jij zegt dat cp1 gelijk moet zijn aan partyid ( dus 1 ) en
jij zegt dat cp2 gelijk moet zijn aan partyid ( dus 1 ) en
jij zegt dat cp3 gelijk moet zijn aan partyid ( dus 1 )

jij krijgt alleen resultaten als de drie parties gelijk zijn, want dit vraag je op.

Trouwens ook wel leuk dat je hierna de 3x dezelfde naam als contractparty 1, 2 en 3 toont. Je bent tenminste wel consequent.

Maar installeer eens phpmyadmin / andere mysql client en voer de query's los in en kijk wat er gebeurt. Dan zie je vanzelf wat er fout gaat.

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 11-04 17:07
Een wijs man zei ooit eens: Qoute je named variabelen....

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Verwijderd

Topicstarter
Ik heb dit probleem inmiddels opgelost, maar zit nu weer met een ander probleempje;

Ik wil een lijstje weergeven met contracten. Er kan een selectie gemaakt worden uit verschillende contractors die de zoekcriteria bepalen. Je kan op twee manieren zoeken:

- Op basis van de geselecteerde contractor 1 en contractor 2
- Op basis van de geselecteerde contractor 1, contractor 2 en contractor 3

Voor ieder van deze twee mogelijkheden heb ik een aparte SQL querie gemaakt:

Contractor 1 + 2. Query A
PHP:
1
2
3
4
5
6
7
8
9
10
$sql = "SELECT contract.id, contract_party_vemedia.name AS vemname,
contract_party.name AS cpname,
contract_type.name AS tname
FROM contract, contract_party, contract_type, contract_party_vemedia
WHERE contract.party1 = contract_party_vemedia.id 
AND contract.party2 = contract_party.id
AND contract.type = contract_type.id 
AND contract.party1 = waarde1 
AND contract.party2 = waarde2 
ORDER BY contract.id ASC";


Contractor 1 + 2 + 3. Query B
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$sql = "SELECT contract.id, contract_party_vemedia.name AS vemname,
contract_party.name AS cpname,
contract_party2.name AS cp2name,
contract_type.name AS tname
FROM contract, contract_party, contract_type, contract_party_vemedia
WHERE contract.party1 = contract_party_vemedia.id 
AND contract.party2 = contract_party.id
AND contract.party3 = contract_party2.id
AND contract.type = contract_type.id 
AND contract.party1 = waarde1 
AND contract.party2 = waarde2 
AND contract.party3 = waarde3
ORDER BY contract.id ASC";


Dit werkt ook prima, maar op basis van de verzonden waardes heb ik een controle ingebouwd die checkt of contractor 3 een waarde heeft. Op basis hiervan wordt 1 van de twee queries gebruikt.

Contractor 1 + 2 = Query A
Contractor 1 + 2 + 3 = Query B

Alleen nu is het zo; Of het lijstje laat de contracten zien die zijn opgebouwd uit 2 contractors of het lijstje laat de contracten zien die zijn opgebouwd uit 3 contractors.
Ik vraag me af of deze twee queries gecombineerd kunnen worden tot 1 query. Dan kan ik 1 lijst maken waar alletwee de verschillende contracten in worden weergegeven? Ik hoop dat ik het duidelijk heb weergegeven?

Alvast bedankt!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Om te zorgen dat er niet twee losse discussies ontstaan over hetzelfde probleem, doe ik dit topic maar op slot. :)

Als er mensen willen reageren op deze laatste vraag: [rml][ MySQL] Samenvoegen van twee SELECT-queries*[/rml]. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.