error in while? unexpected ... diversen :)
Ik probeer een functie te bouwen die een datum uit mijn database haalt.
Nou dacht ik dat ik dat wel onder de knie had, maar wat ik ook doe, dit apparaat blijft maar unexpected errors geven.
De code is volledig zoals die in zen-cart gebruikt wordt, dus de sql query werkt zoals die daar staat. Kan iemand me zeggen wat hier fout gaat?
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
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function get_boek_datum($oId){
global $db;
//de boekingsdatum bepalen op basis van de order history
//hier zit nog een fout in!
$boekdatum_raw = "select orders_status_id, date_added from " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "';
$db->Execute($boekdatum_raw);
while (!$boekdatum_raw->EOF) {
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
echo $this_status_id;
echo $this_boekdatum;
//if ($this_status_id == ''){
// continue;
//}
//if ($this_status_id == 2){
// $boek_datum = $this_boekdatum;
// $found = true;
// }
//if (($this_status_id == 3) && (!$found)){
// $boek_datum = $this_boekdatum;
// $found = true;
// }
//if (($this_status_id == 1) && (!$found)){
// $boek_datum = $this_boekdatum;
//}
$boekdatum = 1;
//$boekdatum_raw->MoveNext();
}
return $boekdatum;
}// END function get_boek_datum($oId)
echo "boekdatum= " . get_boek_datum(1112);
global $db;
//de boekingsdatum bepalen op basis van de order history
//hier zit nog een fout in!
$boekdatum_raw = "select orders_status_id, date_added from " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "';
$db->Execute($boekdatum_raw);
while (!$boekdatum_raw->EOF) {
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
echo $this_status_id;
echo $this_boekdatum;
//if ($this_status_id == ''){
// continue;
//}
//if ($this_status_id == 2){
// $boek_datum = $this_boekdatum;
// $found = true;
// }
//if (($this_status_id == 3) && (!$found)){
// $boek_datum = $this_boekdatum;
// $found = true;
// }
//if (($this_status_id == 1) && (!$found)){
// $boek_datum = $this_boekdatum;
//}
$boekdatum = 1;
//$boekdatum_raw->MoveNext();
}
return $boekdatum;
}// END function get_boek_datum($oId)
echo "boekdatum= " . get_boek_datum(1112);
Als ik de query in mysql direct doe, krijg ik drie datums met drie status id's.
ik dacht dat ik met die while door elk van de drie zou "rollen", maar kennelijk is het anders.
Moet ik nou een array maken omdat die sql 3 waarden tegelijk krijgt?
Nu ik dit zo opschrijf snap ik het geloof ik al waar het mis gaat :)
Echo je query eens?
Code (php)
1
2
3
4
2
3
4
$oID = 112;
//$this_boekdatum_array = array();
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "');
echo $boekdatum_raw;
//$this_boekdatum_array = array();
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "');
echo $boekdatum_raw;
Hij geeft steevast iets als unexpected T_STRING in en dan 5 regels verder.
of:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
$oID = 112;
//$this_boekdatum_array = array();
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "');
while (!$boekdatum_raw->EOF) {
echo $boekdatum_raw;
$boekdatum_raw->MoveNext();
}
//$this_boekdatum_array = array();
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "');
while (!$boekdatum_raw->EOF) {
echo $boekdatum_raw;
$boekdatum_raw->MoveNext();
}
precies hetzelfde
Code (php)
1
2
3
2
3
$boekdatum_raw = " select orders_status_id, date_added
from TABLE_ORDERS_STATUS_HISTORY
WHERE orders_id = ".$oID." ";
from TABLE_ORDERS_STATUS_HISTORY
WHERE orders_id = ".$oID." ";
Gewijzigd op 01/01/1970 01:00:00 door ruben
je eindigt je loop met een return?? dan krijg je toch standaard de laatste waarde van die variabele?
Het lijkt toch ergens in die query te zitten op 1 of andere manier.
In mysql werkt ie gewoon goed:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT orders_status_id, date_added FROM `orders_status_history` WHERE `orders_id` = '1112';
geeft:
orders_status_id date_added
1 2008-12-22 12:44:18
2 2008-12-24 19:40:48
3 2008-12-24 19:40:56
geeft:
orders_status_id date_added
1 2008-12-22 12:44:18
2 2008-12-24 19:40:48
3 2008-12-24 19:40:56
Kan het niet met dat datum veld te maken hebben op 1 of ander manier?
Het kromme is namelijk, dat als ik vlak daaronder een vergelijkbare query doe, maar op een andere tabel, dat ie hem dan wel slikt???
driving me nutz
Code (php)
1
2
3
2
3
<?php
$boekdatum_raw = "select orders_status_id, date_added from " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "'";
?>
$boekdatum_raw = "select orders_status_id, date_added from " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "'";
?>
je mistte nog een " daar aan t eind
Gewijzigd op 01/01/1970 01:00:00 door koen
minstens zes uur kwijt aan die quoot.
en inmiddels zoveel eruit gesloopt dat ik weer opnieuw kan beginnen :)
phew, ff doorbijten als newbie in php :)
reuze bedankt in ieder geval, ik kan weer door, klasse.
btw tip:
als je je script aanpast, sla dan een back-up op.
Gewijzigd op 01/01/1970 01:00:00 door koen
brengt me trouwens op nog een vraagje:
gebruiken jullie (of zijn er...) goede ontwikkelomgevingen voor php?
Ik gebruik al eclipse voor java, en zag daar ook iets voor php in staan maar kwam er nog niet helemaal uit.
Zit nu alles te knutselen in crimson editor, maar iets als eclipse met syntax checking enzo zou wel iets voor mij kunnen zijn ;)
groeten,
jeroen
Ik hoop dat jullie me uit kunnen leggen wat ik hier over het hoofd zie.
De functie ziet er nu als volgt uit:
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
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function get_boek_datum($oID){
global $db;
$found = false;
//de boekingsdatum bepalen op basis van de order history
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "'");
while (!$boekdatum_raw->EOF) {
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
if ($this_status_id == ''){
continue;
}
if ($this_status_id == 2){
$boek_datum = $this_boekdatum;
$found = true;
}
if (($this_status_id == 3) && (!$found)){
$boek_datum = $this_boekdatum;
$found = true;
}
if (($this_status_id == 7) && (!$found)){
$boek_datum = $this_boekdatum;
$found = true;
}
if (($this_status_id == 1) && (!$found)){
$boek_datum = $this_boekdatum;
//$found = true;
}
$boekdatum_raw->MoveNext();
}
$boek_datum = date("d-m-Y", mktime(0,0,0, substr($boek_datum, 5, 2), substr($boek_datum, 8, 2), substr($boek_datum, 0, 4)));
return $boek_datum;
}// einde functie get_boek_datum
global $db;
$found = false;
//de boekingsdatum bepalen op basis van de order history
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "'");
while (!$boekdatum_raw->EOF) {
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
if ($this_status_id == ''){
continue;
}
if ($this_status_id == 2){
$boek_datum = $this_boekdatum;
$found = true;
}
if (($this_status_id == 3) && (!$found)){
$boek_datum = $this_boekdatum;
$found = true;
}
if (($this_status_id == 7) && (!$found)){
$boek_datum = $this_boekdatum;
$found = true;
}
if (($this_status_id == 1) && (!$found)){
$boek_datum = $this_boekdatum;
//$found = true;
}
$boekdatum_raw->MoveNext();
}
$boek_datum = date("d-m-Y", mktime(0,0,0, substr($boek_datum, 5, 2), substr($boek_datum, 8, 2), substr($boek_datum, 0, 4)));
return $boek_datum;
}// einde functie get_boek_datum
De SQL query geeft de volgende waarden:
Volgens mij moet ik als boek_datum de waarde bij 7 eruit krijgen omdat die als eerste "hit" in de if statement en daar de waarde voor found op true zet.
Echter: als ik in de laatste if (==1) de $found = true niet uitcomment, dan geeft ie de waarde behorende bij status_id is 1 ipv die van 7.
Dat kan toch helemaal niet?
Als de functie in de if (==7) found al op true zet, hoe kan ie dan ooit nog in de laatste if (==1) terecht komen?
bedankt,
jeroen
Volgens mij geeft die functie altijd maar één (de laatst gevonden) datum return.
als er geen status_id 2 is maar wel een status_id 3 moet ie daar stoppen enzovoort.
Ik had de functie ook al geprogrammeerd met de return in de if statements zelf, (dus zonder dat $found ertussen) maar dan gedraagt ie zich hetzelfde....
Kennelijk doe ik iets fundamenteels verkeerd, maar ik weet niet wat dat is.
Kan jij me op weg helpen zodat die functie wel doet wat ik wil?
bedankt,
jeroen
$found = true;
En moet je dit gebruiken.
break;
Edit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function get_boek_datum($oID)
{
global $db;
//de boekingsdatum bepalen op basis van de order history
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "'");
while (!$boekdatum_raw->EOF)
{
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
if (in_array($this_status_id, array(2, 3, 7, 1)))
{
$boek_datum = $this_boekdatum;
break;
}
$boekdatum_raw->MoveNext();
}
$boek_datum = date("d-m-Y", mktime(0,0,0, substr($boek_datum, 5, 2), substr($boek_datum, 8, 2), substr($boek_datum, 0, 4)));
return $boek_datum;
} // einde functie get_boek_datum
?>
function get_boek_datum($oID)
{
global $db;
//de boekingsdatum bepalen op basis van de order history
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "'");
while (!$boekdatum_raw->EOF)
{
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
if (in_array($this_status_id, array(2, 3, 7, 1)))
{
$boek_datum = $this_boekdatum;
break;
}
$boekdatum_raw->MoveNext();
}
$boek_datum = date("d-m-Y", mktime(0,0,0, substr($boek_datum, 5, 2), substr($boek_datum, 8, 2), substr($boek_datum, 0, 4)));
return $boek_datum;
} // einde functie get_boek_datum
?>
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
Ik krijg uit deze functie nog steeds de waarde die bij 1 hoort en niet de waarde die ik wil, namelijk die van 7.
Heb de code nu exact zoals hierboven maar hij "breakt" niet!
Gebruik dan ORDER BY en zet ze op volgorde.
Maar dan heb ik nog steeds een probleem, want de waarde 2 heeft de grootste voorkeur, als die bestaat wil/moet ik die hebben als datum en maken de andere waardes niet meer uit.
Als waarde 2 er niet is dan moet ik de waarde voor id 3 hebben.
Als die er niet is dan de waarde voor 7 en heb ik dan nog niks dan pas de waarde voor 1.
Het wordt weer een leerzame middag merk ik al ;)
Gelieve Niet Bumpen::
Gewijzigd op 01/01/1970 01:00:00 door Jeroen Jeroen
Vanwaar die (on)logica?
1. in behandeling
2. vandaag verzonden
3. afgeleverd
4. bijgewerkt
5. wordt verwerkt
6. geannuleerd
7. afgehaald
Waar ik de functie voor nodig heb is om de best mogelijke datum voor de boekhouding te bepalen, wat weer in een programma buiten de webinterface zit.
De best mogelijke datum om te boeken is 2. vraag me niet waarom, dat zegt het vrouwtje en die logica ga ik helemaal niet over nadenken ;)
maar ja, er zijn ook afhalers, veel minder, maar die krijgen dus nooit 2 maar 7, dan is dat de beste datum.
dan heb je ook nog foutjes (het doorschuiven van bestellingen is handmatige actie) en sowieso wil je alles wel boeken dus als 2 en 7 er niet zijn, wil je de datum van 3 als beste datum. Om dezelfde reden is er ook de datum 1 die in principe nooit getriggered zou moeten worden, maar deze zit erin omdat elke order altijd een waarde heeft op 1 (automatisch) dus als er iemand iets helemaal loopt te ver$%^& dan heeft ie in ieder geval nog een waarde
Ik heb de code nu als volgt gemaakt;
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
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function get_boek_datum($oID)
{
global $db;
//de boekingsdatum bepalen op basis van de order history
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "' ORDER BY orders_status_id DESC");
while (!$boekdatum_raw->EOF)
{
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
if (in_array($this_status_id, array(2, 3, 7, 1)))
{
if (($this_status_id == 7) || ($this_status_id == 3))
{
$boek_datum = $this_boekdatum;
}
if ($this_status_id == 2)
{
$boek_datum = $this_boekdatum;
break;
}
if (($this_status_id == 1) && ($boek_datum == ''))
{
$boek_datum = $this_boekdatum;
break;
}
}
$boekdatum_raw->MoveNext();
}
$boek_datum = date("d-m-Y", mktime(0,0,0, substr($boek_datum, 5, 2), substr($boek_datum, 8, 2), substr($boek_datum, 0, 4)));
return $boek_datum;
}// einde functie get_boek_datum
{
global $db;
//de boekingsdatum bepalen op basis van de order history
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "' ORDER BY orders_status_id DESC");
while (!$boekdatum_raw->EOF)
{
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
if (in_array($this_status_id, array(2, 3, 7, 1)))
{
if (($this_status_id == 7) || ($this_status_id == 3))
{
$boek_datum = $this_boekdatum;
}
if ($this_status_id == 2)
{
$boek_datum = $this_boekdatum;
break;
}
if (($this_status_id == 1) && ($boek_datum == ''))
{
$boek_datum = $this_boekdatum;
break;
}
}
$boekdatum_raw->MoveNext();
}
$boek_datum = date("d-m-Y", mktime(0,0,0, substr($boek_datum, 5, 2), substr($boek_datum, 8, 2), substr($boek_datum, 0, 4)));
return $boek_datum;
}// einde functie get_boek_datum
Bij status 7 & 3 geef ik geen break;
en bij status 1 komt ie alleen nog als de datum nog steeds niks heeft.
Volgens mij moet ie goed zijn zo, wel ietsje minder mooi maar ja...
Bedankt voor je hulp!
ps. geen bewuste bump, maar een refresh knop op een verkeerd moment, zag het gelijk maar je eigen post verwijderen kan niet...
edit: nog even ter aanvulling, in vrijwel alle gevallen heeft een bestelling zowel status 3 als status 2. alleen status 3 is vaak een dag of wat later als status 2. als status 2 niet de voorkeursdatum zou zijn voor de boekingen dan zou het inderdaad mooi op te lossen zijn met de waarde die hij als eerste tegenkomt, maar dat is dus niet het geval :)
Gewijzigd op 01/01/1970 01:00:00 door Jeroen Jeroen