Insert query debuggen
Hieronder heb ik een simpel insert query, wat helaas maar niet wil werken.
Ik heb alle mogelijk foutmeldingen eruit gehaald, maar ik kom er nog steeds niet uit...
Zou iemand naar willen kijken en mij voorzien van waardevolle feedback?
Alvast bedankt.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$medicinequery = "INSERT INTO medicines
(medicinename, genericname,productiondate,expiredate,quantity,sellingprice,purchaseprice,medicineregistration, userid)
VALUES
('$medicinename','$genericname','$production', '$expire','$quantity', '$sellingprice', '$purchaseprice', NOW(), '{$_SESSION['user_id']}')";
$r = mysqli_query ($dbc, $medicinequery) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
?>
$medicinequery = "INSERT INTO medicines
(medicinename, genericname,productiondate,expiredate,quantity,sellingprice,purchaseprice,medicineregistration, userid)
VALUES
('$medicinename','$genericname','$production', '$expire','$quantity', '$sellingprice', '$purchaseprice', NOW(), '{$_SESSION['user_id']}')";
$r = mysqli_query ($dbc, $medicinequery) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
?>
Een tipje: Variabelenhoren buiten quotes.
Gewijzigd op 10/03/2017 20:37:52 door - Ariën -
- Ariën - op 10/03/2017 20:36:54:
Welke foutmelding krijg je dan?
Een tipje: Variabelenhoren buiten quotes.
Een tipje: Variabelenhoren buiten quotes.
Hallo Ariën,
Ik krijg helaas geen foutmelding, enkel dat script niet gelukt is
En waar komt die code ^ vandaan?
Gewijzigd op 10/03/2017 20:53:17 door - Ariën -
- Ariën - op 10/03/2017 20:52:39:
Echo eens $medicinequery, klopt die query die je krijgt?
En waar komt die code ^ vandaan?
En waar komt die code ^ vandaan?
Het tekentje ^ zie ik het niet.
Op welk regel zie je het?
Bij het echoën van de query verschijnt het volgende:
En, vreemd genoeg zijn alle waardes goed, behalve dat huidige time niet wordt weergegeven en dus enkel het commando now() wordt weergegeven. En misschien maakt de volgorde van vakjes niet uit, maar hiermee heb ik wel rekening gehouden en de volgorde klopt het op form niveau, invoer niveau en database niveau..
Code (php)
1
2
3
2
3
<?php
INSERT INTO medicines (medicinename, genericname,productiondate,expiredate,quantity,sellingprice,purchaseprice,medicineregistration, userid) VALUES (test,test1,2011-01-01,2017-01-01,5,5,5, NOW(), 3)
?>
INSERT INTO medicines (medicinename, genericname,productiondate,expiredate,quantity,sellingprice,purchaseprice,medicineregistration, userid) VALUES (test,test1,2011-01-01,2017-01-01,5,5,5, NOW(), 3)
?>
Gewijzigd op 10/03/2017 21:29:50 door Mohamed nvt
Waar komt die code vandaan? Want als je query niet werkt zou die trigger_error moeten worden aangeroepen.
Kan je die query uit je echo eens in phpMyAdmin (of een andere mySQL-client) gooien?
Die eerste 4 values zijn niet-numeriek en moeten dus tussen single quotes.
Ik gok dat Ariën wat verwarring heeft veroorzaakt met zijn opmerking dat variabelen buiten quotes horen. Waar ik het overigens niet per se mee eens ben. ;-)
Wellicht is het handig om ook nog
aan het begin van je script op te nemen. Het zou kunnen dat die nu zo staat ingesteld dat trigger_error() niets laat zien.
Gewijzigd op 11/03/2017 00:03:42 door Willem vp
Het komt de leesbaarheid van je query ook ten goede als je deze over meerdere regels uitschrijft, en deze hoef je niet in een aparte variabele te stoppen, te meer omdat je deze variabele verder toch niet lijkt te gebruiken (waar komt overigens $q vandaan?):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$r = $dbc->query(
"INSERT INTO medicines (
medicinename,
genericname,
productiondate,
expiredate,
quantity,
sellingprice,
purchaseprice,
medicineregistration,
userid
) VALUES (
'$medicinename',
'$genericname',
'$production',
'$expire',
'$quantity',
'$sellingprice',
'$purchaseprice',
NOW(),
'{$_SESSION['user_id']}'
)"
);
?>
$r = $dbc->query(
"INSERT INTO medicines (
medicinename,
genericname,
productiondate,
expiredate,
quantity,
sellingprice,
purchaseprice,
medicineregistration,
userid
) VALUES (
'$medicinename',
'$genericname',
'$production',
'$expire',
'$quantity',
'$sellingprice',
'$purchaseprice',
NOW(),
'{$_SESSION['user_id']}'
)"
);
?>
Dit heeft weliswaar iets meer lucht, maar is zoveel beter leesbaar. Vooral als je hier nog escaping overheen moet gooien.
Foutafhandeling zou ik ook op een andere manier doen dan trigger_error() en als deze query onderdeel is van een reeks queries zou ik sterk overwegen om transacties te gebruiken.
Gewijzigd op 11/03/2017 02:09:43 door Thomas van den Heuvel
Onder de bovenstaande query had ik staan andere queries, maar die moest ik eerst nog oplossen.
Iig ik kan nu data invoeren via het invoerformulier, mits de volgende voorwaarden waar zijn:
1. Als er reeds een medicijnbedrijf bestaat/ingevoerd
2. Als er reeds een medicijnland bestaat/ingevoerd
3. Als er reeds een medicijnleverancier bestaat/ingevoerd
Eerst even wat achtergrond info:
Voorheen gebruikte ik een dropdown-menu om een van de drie bovenstaande punten te laten kiezen. En, wanneer deze punten niet bestonden, dan moest de gebruiker deze drie punten eerst invoeren in db, alvorens een medicijn te kunnen voeren.
En om met de tijd om te gaan en het invoerformulier gebruikersvriendelijk te maken, gebruik ik nu autocomplete feature. En, zoals jullie weten, checkt autocomplete of er reeds een waarde bestaat in de DB en de gebruiker hoeft enkel een letter in te voeren en de gematcht woord komt te verschijn.
Maar het probleem wat ik nu tegen aan loop, is dat ik 3 koppeltabellen heb voor medicijnland, medicijnleverancier en medicijnbedrijf. En om deze koppeltabellen te kunnen invoeren, moet ik het id hebben van de item van de origineel tabel.
Maar jullie raden het al; op het moment dat ik een medicijn invoer, dan zijn de originele tabellen van medicijnland, medicijnleverancier en medicijnbedrijf nog leeg...
En dus mijn vraag is; hoe kan ik ervoor zorgen dat wanneer een gebruiker data invoert in medicijnbedrijf vakje of in die twee andere vakjes, de data direct wordt opgeslagen in de origineel tabel, zodat ik het id van de item van de origineel tabel kan gebruiken voor het invoerformulier
Als je het wil testen, wat ik bedoel, bezoek dan:
hawarco.co
gebruikersnaam: [email protected]
pw: test1
Hopelijk is mijn verhaal duidelijk en alvast bedankt voor het meedenken!
Mohamed nvt op 11/03/2017 15:20:14:
Maar het probleem wat ik nu tegen aan loop, is dat ik 3 koppeltabellen heb voor medicijnland, medicijnleverancier en medicijnbedrijf. En om deze koppeltabellen te kunnen invoeren, moet ik het id hebben van de item van de origineel tabel.
Maar jullie raden het al; op het moment dat ik een medicijn invoer, dan zijn de originele tabellen van medicijnland, medicijnleverancier en medicijnbedrijf nog leeg...
Maar jullie raden het al; op het moment dat ik een medicijn invoer, dan zijn de originele tabellen van medicijnland, medicijnleverancier en medicijnbedrijf nog leeg...
Kan het medicijn dan meerdere landen van herkomst, leveranciers en bedrijven/producenten hebben? Zonee, waarom dan een koppeltabel? Ook wil je waarschijnlijk pas informatie opslaan als deze compleet is, dus alle informatie, of géén informatie anders raakt je data corrupt doordat je dingen maar half opslaat.
Thomas van den Heuvel op 14/03/2017 00:18:42:
Kan het medicijn dan meerdere landen van herkomst, leveranciers en bedrijven/producenten hebben? Zonee, waarom dan een koppeltabel? Ook wil je waarschijnlijk pas informatie opslaan als deze compleet is, dus alle informatie, of géén informatie anders raakt je data corrupt doordat je dingen maar half opslaat.
Mohamed nvt op 11/03/2017 15:20:14:
Maar het probleem wat ik nu tegen aan loop, is dat ik 3 koppeltabellen heb voor medicijnland, medicijnleverancier en medicijnbedrijf. En om deze koppeltabellen te kunnen invoeren, moet ik het id hebben van de item van de origineel tabel.
Maar jullie raden het al; op het moment dat ik een medicijn invoer, dan zijn de originele tabellen van medicijnland, medicijnleverancier en medicijnbedrijf nog leeg...
Maar jullie raden het al; op het moment dat ik een medicijn invoer, dan zijn de originele tabellen van medicijnland, medicijnleverancier en medicijnbedrijf nog leeg...
Kan het medicijn dan meerdere landen van herkomst, leveranciers en bedrijven/producenten hebben? Zonee, waarom dan een koppeltabel? Ook wil je waarschijnlijk pas informatie opslaan als deze compleet is, dus alle informatie, of géén informatie anders raakt je data corrupt doordat je dingen maar half opslaat.
Hallo Thomas van den Heuvel,
Ja, dezelfde medicijn kan afkomstig zijn uit verschillende landen, geleverd worden door verschillende leverancier en gemaakt worden door verschillende bedrijven..En daarom heb ik koppeltabellen gemaakt voor deze 3 criteria. Overigens heb ik nu gewoon dropdown-menu en geen autocomplete voor deze punten..
Tnx!
Dat lijkt nu in je datamodel te ontbreken, doordat je één medicijn rechtstreeks via drie koppeltabellen koppelt aan meerdere medicijnlanden, medicijnleveranciers en medicijnbedrijven. Mis je hier niet een niveau voor medicijntype, bijvoorbeeld "aspirine" of "paracetamol"? (Waarbij ik me en passant trouwens afvraag wat dan het verschil is tussen een medicijnleverancier en een medicijnbedrijf: een bedrijf is een bedrijf, dus je moet dat misschien ook nog uitsplitsen.)
Als je een combinatie van toevoegen en selecteren wilt bouwen voor de autocomplete met bestaande en nieuwe leveranciers, zul je dat in de models en controllers moeten splitsen. Dat gaat niet met één INSERT voor één nieuw medicijn.