fout met array?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robert  dat ben ik

Robert dat ben ik

14/01/2009 21:01:00
Quote Anchor link
hallo ik ben met een rpg game bezig te bouwen

alleen ik zit met een update die dus elke uur dag week maand update

ik krijg nu de vologende error

Warning: Cannot use a scalar value as an array in /home/wishmaster/domains/radio-extase.nl/public_html/data/config.php on line 36

het staat hier in er staat een stukke //text bij ook waar

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
36
37
38
39
40
<?
$dbres
= mysql_query("SELECT UNIX_TIMESTAMP(`time`) AS `time`,`name` FROM `[cron]`");
while($x = mysql_fetch_object($dbres))

$update[$x->name] = $x->time; //hier geeft ie een fout op

if(floor($update['hour']/3600) != floor(time()/3600)) {
 $dbres = mysql_query("SELECT GET_LOCK('hour_update',0)");
 if(mysql_result($dbres,0) == 1) {
   mysql_query("UPDATE `[cron]` SET `time`=NOW() WHERE `name`='hour'");
   include("_cron_hour.php");
   mysql_query("SELECT RELEASE_LOCK('hour_update')");
  }
 }

 if(floor($update['day']/86400) != floor(time()/86400)) {
  $dbres = mysql_query("SELECT GET_LOCK('day_update',0)");
  if(mysql_result($dbres,0) == 1) {
   mysql_query("UPDATE `[cron]` SET `time`=NOW() WHERE `name`='day'");
   include("_cron_day.php");
   mysql_query("SELECT RELEASE_LOCK('day_update')");
  }
 }

 if(floor($update['week']/604800) != floor(time()/604800)) {
  $dbres = mysql_query("SELECT GET_LOCK('week_update',0)");
  if(mysql_result($dbres,0) == 1) {
   mysql_query("UPDATE `[cron]` SET `time`=NOW() WHERE `name`='week'");
   include("_cron_week.php");
   mysql_query("SELECT RELEASE_LOCK('week_update')");
   }
  }

  if(date('n',$update['month']) != date('n',time())) {
   $dbres = mysql_query("SELECT GET_LOCK('month_update',0)");
   if(mysql_result($dbres,0) == 1) {
    mysql_query("UPDATE `[cron]` SET `time`=NOW() WHERE `name`='month'");
    include("_cron_month.php");
    mysql_query("SELECT RELEASE_LOCK('month_update')");
   }
  }


?>



Mijn database ziet er zo uit
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
CREATE TABLE IF NOT EXISTS `[cron]` (
  `time` datetime default NULL,
  `name` varchar(16) NOT NULL default '',
  PRIMARY KEY  (`name`)
)
ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
--
Gegevens worden uitgevoerd voor tabel `[cron]`
--

INSERT INTO `[cron]` (`time`, `name`) VALUES
('2009-01-14 20:56:01', 'hour'),
(
'2009-01-14 20:56:01', 'day'),
(
'2009-01-14 20:56:01', 'week'),
(
'2008-01-14 20:10:00', 'month');

?>


hij kijkt dus naar de tijd als die over de aangegeven tijd heen is uur dag week maand dan moet ie update maar dat werkt ook wel

alleen ik krijg die fout hoe kan ik dit oplossen?
Gewijzigd op 01/01/1970 01:00:00 door Robert dat ben ik
 
PHP hulp

PHP hulp

29/03/2024 13:12:46
 
Frank -

Frank -

14/01/2009 21:03:00
Quote Anchor link
Tip: Ga de code eens opnieuw schrijven en alle ellende eruit gooien. Backticks ` en blokhaken [] horen niet thuis in SQL, gooi die shitzooi dan ook weg. Het gaat bugs opleveren.
 
Robert  dat ben ik

Robert dat ben ik

14/01/2009 21:08:00
Quote Anchor link
pgFrank schreef op 14.01.2009 21:03:
Tip: Ga de code eens opnieuw schrijven en alle ellende eruit gooien. Backticks ` en blokhaken [] horen niet thuis in SQL, gooi die shitzooi dan ook weg. Het gaat bugs opleveren.


En wat is hier de beste manier hier voor om dit beter te krijgen dan?
kan je klein voorbeeld geven hoe het dan wel moet?
 
Robert  dat ben ik

Robert dat ben ik

15/01/2009 11:13:00
Quote Anchor link
iemand anders die kan helpen hoe ik dit beter kan maken?
 
Joren de Wit

Joren de Wit

15/01/2009 11:19:00
Quote Anchor link
Begin allereerst met het normaliseren van je datamodel en zorg dat je met een goede opzet aan de slag gaat.

Denk daarna eens goed na over de opzet van je scripts. Ik zie bijvoorbeeld niet in waarom je een tabel 'cron' nodig zou hebben. Dit suggereert een alternatief voor het gebruik van cron-jobs en dat is al iets dat je bijna nooit nodig hebt. Althans, niet in een goed opgezette omgeving.

Zorg vervolgens dat je je PHP scripts op een logische manier opbouwt en pas de nodige foutafhandeling toe. Dat ontbreekt ook in bovenstaande voorbeeld.
 
Hipska BE

Hipska BE

15/01/2009 11:45:00
Quote Anchor link
Allereerst zou je met de gegeven oplossing iets kunnen doen.

Zoals pgFrank zegt, haal die ` dingen uit je query's en tabellen en velden horen nooit [ of ] te bevatten. Als je die ` niet gebruikt had, zou je dit al gemerkt hebben bij het aanmaken van je tabel.

Die ` in SQL zijn gelijk aardig als @ gebruiken in php, het zorgt ervoor dat fouten niet tevoorschijn komen, en later is het moeilijker om bugs op te sporen. Dit is namelijk een situatie waar jij nu in zit.
 
Robert  dat ben ik

Robert dat ben ik

15/01/2009 12:13:00
Quote Anchor link
Blanche schreef op 15.01.2009 11:19:
Ik zie bijvoorbeeld niet in waarom je een tabel 'cron' nodig zou hebben.


dit stuk is alleen voor de date en time en bepaalde waarden die er in staan zo dat het script weet dat ie op die dag en tijd moet update, het heeft niet zo veel zin ook om het bij elke member in hun table te zetten omdat dit niet member gericht is
dit moet gewoon een automatische update zijn op datum voor de game zelf


de bedoeling van deze update is:
mensen die hebben een kogelfabiek gekocht zeg maar,
en die moet produceren..
die moet om het uur update zeg maar
dan moeten de aangegeven waardes gecheckt worden(van daar die cron tabel want hier staat die info in) en dan geupdate worden

dan staan er nog meerdere opties in deze tabel om ook de log's en alles te wissen die een langer dan 24uur al bestaan.


dit was al een bestaand script en ik wil echt graag zelf 1 maken maar ik weet niet echt de beste manier is om dit te doen

1: is het wel verstandig om er een aparte tabel voor te gebruiken, ik neem aan van wel, zeker voor het overzicht
2: wat is de meest snelste manier om de uren dagen en weken en maanden te controleren?
3: hoe kan ik er voor zorgen dat updates ook echt plaats vinden

nu update ie ook niet?

greetz MaDHouSe







edit:
Hipska schreef op 15.01.2009 11:45:
Allereerst zou je met de gegeven oplossing iets kunnen doen.

Zoals pgFrank zegt, haal die ` dingen uit je query's en tabellen en velden horen nooit [ of ] te bevatten. Als je die ` niet gebruikt had, zou je dit al gemerkt hebben bij het aanmaken van je tabel.

Die ` in SQL zijn gelijk aardig als @ gebruiken in php, het zorgt ervoor dat fouten niet tevoorschijn komen, en later is het moeilijker om bugs op te sporen. Dit is namelijk een situatie waar jij nu in zit.



ik ga hier echt ff naar kijken wat je al zegt met die @ wist ik, ik wist neit dat het zelfde geval met ` ook was ik ga er direct naar kijken!! thnx



edit:
ik heb hem nu zo is dit beter?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
CREATE TABLE IF NOT EXISTS `cron` (
  `time` datetime default NULL,
  `name` varchar(16) NOT NULL default '',
  PRIMARY KEY  (`name`)
)
ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
--
Gegevens worden uitgevoerd voor tabel `cron`
--

INSERT INTO `cron` (`time`, `name`) VALUES
('2009-01-15 12:02:16', 'hour'),
(
'2009-01-15 11:28:57', 'day'),
(
'2009-01-15 11:28:57', 'week'),
(
'2008-01-14 20:10:00', 'month');
?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
36
37
38
39
40
41
42
43
<?
$dbres
= mysql_query("SELECT UNIX_TIMESTAMP(time) AS time,name FROM cron");
while($x = mysql_fetch_object($dbres))

$update[$x->name] = $x->time;

if(floor($update['hour']/3600) != floor(time()/3600)) {
 $dbres = mysql_query("SELECT GET_LOCK('hour_update',0)");
 if(mysql_result($dbres,0) == 1) {
   $cron_pass = "secretcronpassword";
   mysql_query("UPDATE cron SET time=NOW() WHERE name='hour'");
   include("_cron_hour.php");
   mysql_query("SELECT RELEASE_LOCK('hour_update')");
  }
 }

 if(floor($update['day']/86400) != floor(time()/86400)) {
  $dbres = mysql_query("SELECT GET_LOCK('day_update',0)");
  if(mysql_result($dbres,0) == 1) {
   $cron_pass = "secretcronpassword";
   mysql_query("UPDATE cron SET time=NOW() WHERE name='day'");
   include("_cron_day.php");
   mysql_query("SELECT RELEASE_LOCK('day_update')");
  }
 }

 if(floor($update['week']/604800) != floor(time()/604800)) {
  $dbres = mysql_query("SELECT GET_LOCK('week_update',0)");
  if(mysql_result($dbres,0) == 1) {
   $cron_pass = "secretcronpassword";
   mysql_query("UPDATE cron SET time=NOW() WHERE name='week'");
   include("_cron_week.php");
   mysql_query("SELECT RELEASE_LOCK('week_update')");
   }
  }

  if(date('n',$update['month']) != date('n',time())) {
   $dbres = mysql_query("SELECT GET_LOCK('month_update',0)");
   if(mysql_result($dbres,0) == 1) {
    $cron_pass = "secretcronpassword";
    mysql_query("UPDATE cron SET time=NOW() WHERE name='month'");
    include("_cron_month.php");
    mysql_query("SELECT RELEASE_LOCK('month_update')");
   }
  }

?>




ik gebruik ook dit in me config.php die word zo ie zo boven aan elke pagina geladen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?
$error
= 1;
if($error == 1) {
 ini_set('display_errors', 1);
 error_reporting(E_ALL);
}

?>




edit: wat ik ook niet snap is dit
als ik op mijn profiel kijk zie ik geen enkele fout
kijk ik bij een ander op zijn profiel dan pas krijg ik die fout

Warning: Cannot use a scalar value as an array in /home/wishmaster/domains/radio-extase.nl/public_html/data/config.php on line 36

en verder krijg ik het nergens en me config file word zo ie zo altijd geladen
wat gaat er dan fout ik snap dit echt niet
Gewijzigd op 01/01/1970 01:00:00 door Robert dat ben ik
 
Joren de Wit

Joren de Wit

15/01/2009 12:49:00
Quote Anchor link
MaDHouSe schreef op 15.01.2009 12:13:
bij elke member in hun table
Bedoeld je dat elke member een eigen tabel heeft? Dan gaat er dus iets goed fout en zul je echt moeten gaan normaliseren, zie de link in mijn vorige post.

Quote:
die moet om het uur update zeg maar
Is dat zo? Wat is de reden dat dat per se elk uur moet gebeuren? Grote kans dat het ook voldoende is om die update uit te voeren zodra er iemand online komt. In dat geval controleer je hoeveel uur er verstreken is en voer je gewoon een veelvoud van die update uit, mocht dat nodig zijn.

In 9 van de 10 gevallen slaat het nergens op om elk uur een scriptje te runnen. Als er niemand op de website aanwezig is, is het vaak ook niet nodig om die updates uit te voeren. Dat kun je ook met terugwerkende kracht doen zodra er iemand online komt.
 
Robert  dat ben ik

Robert dat ben ik

15/01/2009 13:11:00
Quote Anchor link
kijk het is een game die ik verbouw

mensen kunnen tegen elkaar game zeg maar maar ook zelf moeten ze hoger op komen

nou de members hebben dus wel een eigen tabel maar dat is puur voor hun zelf met ww gebruikersnaam enz enz enz en wat variables van de game, dit alles werkt allemaal goed.

de members die dus mee doen aan het spel, kunnen in het spel een kogelfabriek kopen

maar bij de kogelfabiek heb je dus 4 opties om te doen
1:maak 50 kogels per uur voor zo veel geld
2:maak 100 kogels per uur voor zo veel geld
3:maak 150 kogels per uur voor zo veel geld
4:maak 250 kogels per uur voor zo veel geld

nou dat is de opzet om die updates te doen

verder word er ook een log tabel gemaakt met de nodige opties maar die werkt wel goed

het is gewoon een rpg game die ik eigelijk intergreer maar ik heb al zo veel fouten er uit moeten halen voor ik zo ver was maar deze snap ik echt niet
ben al zeker weken bezig om het voor elkaar te krijgen maar ut lukt niet :(
vandaar dat ik ff hier hulp vroeg hoe het beter kan

die line wat ik zei waar die fout bij staat, is dit:

$dbres = mysql_query("SELECT UNIX_TIMESTAMP(time) AS time,name FROM cron");
while($x = mysql_fetch_object($dbres)) {
$update[$x->name] = $x->time;


maar het raarste is waarom heb ik het niet op mijn profiel en wel op een ander profiel van een member

terwijl het profiel er eigelijk niks mee te maken heeft..

dit staat gewoon in mijn config.php en die word op elke pagina geladen
dan zou je ook zeggen dat hij ook op elke pagina die fout moet geven
en dat doet hij dus niet
daarom snap ik het niet
Gewijzigd op 01/01/1970 01:00:00 door Robert dat ben ik
 
Joren de Wit

Joren de Wit

15/01/2009 13:21:00
Quote Anchor link
MaDHouSe schreef op 15.01.2009 13:11:
nou de members hebben dus wel een eigen tabel maar dat is puur voor hun zelf met ww gebruikersnaam enz enz enz en wat variables van de game, dit alles werkt allemaal goed.
Dat is dus gewoon fout! Normaal gesproken zet je een datamodel eenmaal op en verander je er vervolgens nooit meer iets aan. Zodra jij nieuwe tabellen aan gaat maken als een nieuw lid zich aanmeldt, zit er gewoon een grote fout in de opzet van je hele applicatie. Grote kans dat deze verkeerde opzet van je database de basis vormt voor het probleem waar je nu tegenaan loopt.

Quote:
het is gewoon een rpg game die ik eigelijk intergreer maar ik heb al zo veel fouten er uit moeten halen voor ik zo ver was maar deze snap ik echt niet
Mijn advies: gooi dit hele script weg en schrijf zelf je eigen script. Zorg dat je een origineel idee hebt en werk dat verder uit. Er zijn al honderden, zo niet duizenden van dit soort games online te vinden, wat maakt jouw spel dan uniek? Denk daar over na. En als je dan een goed idee hebt, zorg dan dat je op de juiste wijze aan de slag gaat, dus normaliseren, foutafhandeling, etc...

Als je het maakt om jezelf PHP aan te leren, vergeet het dan maar. Deze scripts vormen geen goede voorbeelden van hoe je PHP zou moeten programmeren. Dit zijn vaak de slechtst gescripte voorbeelden die je maar kunt vinden. Helaas pindakaas...
 
Hipska BE

Hipska BE

15/01/2009 13:26:00
Quote Anchor link
Ik zie nergens waar $update vandaan komt.

En ivm die kogels per uur:
laat een veld opslaan welk tijdstip je laatst aantal kogels gecontrolleerd hebt, bij de volgende keer dat je het aantal kogels nodig hebt ga je gewoon rekenen hoeveel uur er tussen nu en de laatste update zat. Doe dit getal nu gewoon x aantal kogels per uur. Geen cron nodig dus.
 
Robert  dat ben ik

Robert dat ben ik

15/01/2009 13:41:00
Quote Anchor link
Quote:
Normaal gesproken zet je een datamodel eenmaal op en verander je er vervolgens nooit meer iets aan. Zodra jij nieuwe tabellen aan gaat maken als een nieuw lid zich aanmeldt, zit er gewoon een grote fout in de opzet van je hele applicatie.


de datamodel word niet aangepast hoor die is 1x gemaakt en nooit meer veranderd zodra een iemand zijn eigen aanmeld dan word er alleen een insert gedaan. en alle gegevens worden dan ook presies zo aangegeven hoe ze moeten zijn op de active en gameplay na die worden op 0 gezet omdat je je account moet activeren en je game moet activeren that it meer veranderd er niets tijdens het aanmelden



ik ben het met je eens als ik echt een nieuw datamodel heb gemaakt
voor members en ik voeg er nog een tabel bij in die members, dan weet ik ook wel dat ik het bij de insert moet bijvoegen anders werkt het niet of geeft fouten omdat het niet goed staat.



edit: nogmaals.. die members hebben ff niks met die kogelfabiek te maken
het gaat mijn erom dat ie update meer niet :)
Gewijzigd op 01/01/1970 01:00:00 door Robert dat ben ik
 
Robert  dat ben ik

Robert dat ben ik

15/01/2009 14:17:00
Quote Anchor link
Hipska schreef op 15.01.2009 13:26:
Ik zie nergens waar $update vandaan komt.

En ivm die kogels per uur:
laat een veld opslaan welk tijdstip je laatst aantal kogels gecontrolleerd hebt, bij de volgende keer dat je het aantal kogels nodig hebt ga je gewoon rekenen hoeveel uur er tussen nu en de laatste update zat. Doe dit getal nu gewoon x aantal kogels per uur. Geen cron nodig dus.


wat jij zegt moet ook gebeuren
zodra ik er op klik dan word in die cron de tijd ook opgeslagen met NOW()
maar omdat ik moet kijken welke optie het is uur dag week maand kom ik hier ff niet uit
en in die cron staat aangegeven

time = deze tijd opgeslagen met NOW()
name = de naam met-> uur dag week maand

zo ziet het er uit dan
time=NOW() name=uur
time=NOW() name=dag
time=NOW() name=week
time=NOW() name=maand

ok nou doe ik het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

<?
$dbres
= mysql_query("SELECT UNIX_TIMESTAMP(time) AS time,name FROM cron");
$x = mysql_fetch_object($dbres);
$update[$x->name] = $x->time; //hier zit de fout

$x->name //zou dus uur dag week maand moeten zijn
$x->time //geeft dus de tijd aan waneer de laatste update plaats vond
[code]<?
[/code]
maar nu zeg ie nu die fout die ik al eerder aangaf

omdat ditn iet kan volgens de fout

$update[$x->name] = $x->time;

wat gaat er fout dan?
Gewijzigd op 01/01/1970 01:00:00 door Robert dat ben ik
 
Joren de Wit

Joren de Wit

15/01/2009 14:21:00
Quote Anchor link
Blijkbaar heb je $update al een keer gedeclareerd en is het daar geen array.

Vergelijk dit voorbeeldje, dat geeft dezelfde foutmelding:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$update
= 1;
$update['key'] = 'waarde';
?>
 
Robert  dat ben ik

Robert dat ben ik

15/01/2009 14:50:00
Quote Anchor link
probleem is al verholpen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?
$dbres
= mysql_query("SELECT * FROM cron");
while($x = mysql_fetch_object($dbres)) {
 if($x->name == "hour") { $updateuur = $x->time; }
 if($x->name == "day") { $updatedag = $x->time; }
 if($x->name == "week") { $updateweek = $x->time; }
}

if(floor($updateuur/3600) != floor(time()/3600)) {
 if(mysql_result($dbres,0) == 1) {
  mysql_query("UPDATE cron SET time=NOW() WHERE name='hour'");
  include("_cron_hour.php");
 }
}

if(floor($updatedag/86400) != floor(time()/86400)) {
 if(mysql_result($dbres,0) == 1) {
  mysql_query("UPDATE cron SET time=NOW() WHERE name='day'");
  include("_cron_day.php");
 }
}

if(floor($updateweek/604800) != floor(time()/604800)) {
 if(mysql_result($dbres,0) == 1) {
  mysql_query("UPDATE cron SET time=NOW() WHERE name='week'");
  include("_cron_week.php");
 }
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Robert dat ben ik
 
Joren de Wit

Joren de Wit

15/01/2009 15:17:00
Quote Anchor link
Nee, ik zeg dat je waarschijnlijk eerder in je script al een keer $update gebruikt en dat het in dat geval geen array is. Dan kun je hier de variabele $update dus ook niet zomaar als een array gaan behandelen...

Ofwel kies een andere naam voor $update ofwel maak er eerst een array van:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$update
= array();
?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.