Gå til innhold

json_encode fungerer ikke på server eller med PHP


Anbefalte innlegg

Hei!

 

På min server så fungerer ikke json_encode i det hele tatt, heller ikke javascript..

 

Dette er ett script som kjører json_encode, den henter ikke ut noe informasjon i det hele tatt:

 

<?php

set_time_limit(1);

session_start();

header('Content-type: application/json');

$menuads = array(
 'time',
 'brekk_timeleft',
 'blackmail_timeleft',
 'car_theft_timeleft',
 'in_jail',
 'new_logevents',
 'new_pms',
 'online'
);


$result = array ();


if (!isset($_SESSION['MZ_LoginData']))
{
 $result['error'] = 1;
}
if ($result['error']) die( json_encode($result) );


mysql_connect('localhost', 'KHA_mz', 'kr1st0fferxX') or die('ERROR #4');
mysql_select_db('KHA_mz_db') or die('ERROR #5');

$sql    = mysql_query("SELECT id,userid,health,level,hospital_data FROM `[players]` WHERE `userid`='".$_SESSION['MZ_LoginData']['userid']."' ORDER BY id DESC LIMIT 0,1");
$player = mysql_fetch_array($sql);


if ($player['health'] <= 0 || $player['level'] <= 0)
{
 $result['error'] = 2;
}

if ($result['error']) die( json_encode($result) );

$sql = mysql_query("SELECT id,added,penalty FROM `jail` WHERE `playerid`='".$player['id']."' AND `added`+`penalty`>".time()."");
$jail = mysql_fetch_array($sql);

$jailTime = 0;
if ($jail['id'] != '')
{
 $jailTime = $jail['added'] + $jail['penalty'] - time();
 if ($jailTime < 0) $jailTime = 0;
}

$hospital_data = unserialize($player['hospital_data']);
$hospitalTime = $hospital_data['added'] + $hospital_data['time_length'] - time();

$waitTime = 0;
if ($jailTime > 0 || $hospitalTime > 0)
{
 $waitTime = $jailTime > $hospitalTime ? $jailTime : $hospitalTime;
}

foreach ($menuads as $ad_id)
{
 if ($ad_id == 'time')
 {
  $data = time();

 } elseif ($ad_id == 'brekk_timeleft')
 {
  $sql = mysql_query("SELECT last,latency FROM `brekk` WHERE `playerid`='".$player['id']."'");
  $brekk = mysql_fetch_array($sql);

  $last_crime = explode(",", $brekk['last']);
  $last_time  = $last_crime[0];

  $latency = round($last_time+$brekk['latency'] - time(), 0);
  $latency = $latency <= 0 ? 0 : $latency;

  $data = $waitTime > $latency ? $waitTime : $latency;

 } elseif($ad_id == 'blackmail_timeleft')
 {
  $sql = mysql_query("SELECT last_time,latency FROM `blackmail` WHERE `playerid`='".$player['id']."'");
  $blackmail = mysql_fetch_array($sql);

  $latency = $blackmail['last_time'] + $blackmail['latency'] - time();
  $latency = $latency <= 0 ? 0 : $latency;

  $data = $waitTime > $latency ? $waitTime : $latency;

 } elseif($ad_id == 'car_theft_timeleft')
 {
  $sql = mysql_query("SELECT last_time,latency FROM `car_theft` WHERE `playerid`='".$player['id']."'");
  $car_theft = mysql_fetch_array($sql);

  $latency = $car_theft['last_time'] + $car_theft['latency'] - time();
  $latency = $latency <= 0 ? 0 : $latency;

  $data = $waitTime > $latency ? $waitTime : $latency;

 } elseif($ad_id == 'in_jail')
 {
  $num = mysql_num_rows(mysql_query("SELECT id FROM `jail` WHERE `active`='1'"));
  $data = $num;

 } elseif($ad_id == 'new_logevents')
 {
  $num = mysql_num_rows(mysql_query("SELECT id FROM `KHA_mz_db`.`logevents` WHERE `userid`='".$player['userid']."' AND `viewed`='0'"));
  $data = $num;

 } elseif($ad_id == 'new_pms')
 {
  $num = mysql_num_rows(mysql_query("SELECT id FROM `messages` WHERE `to_user`='".$player['userid']."' AND `read`='0' AND `deleted`='0'"));
  $data = $num;

 } elseif($ad_id == 'online')
 {
  $num = mysql_num_rows(mysql_query("SELECT id FROM `[users]` WHERE `online`+'3600' > '".time()."' AND `hasPlayer`='1'"));
  $data = $num;

  $sql = mysql_query("SELECT online_stats FROM `game_stats` ORDER BY last_updated DESC LIMIT 1");
  $stats = mysql_fetch_array($sql);
  $online_stats = unserialize($stats['online_stats']);

  if ($num > $online_stats['highest_online'][0])
  {
   $online_stats['highest_online'] = array($num, time());
   mysql_query("UPDATE `game_stats` SET `online_stats`='".serialize($online_stats)."'");
  }
 }

 $result['menuads'][] = array(
  'class' => $ad_id,
  'data' => $data
 );
}

die( json_encode($result) );
?>

 

Om noen kunne hjulpet meg med å finne ut hvorfor det ikke fungerer så hadde det vært konge!

 

- KRIZx

Lenke til kommentar
Videoannonse
Annonse

Data du sender med json_encode() må være utf-8. Så du kan prøve å endre til

$result['menuads'][] = array(
  'class' => utf8_encode($ad_id),
  'data' => utf8_encode($data)
 );

 

Det fungerte ikke.. er det en annen løsning på det her?

 

- KRIZx

Lenke til kommentar

Åpne Firebug, Operas Dragonfly eller andre utviklingsverktøy og se hva som blir sent fra klienten og hva serveren svarer. Du finner dette (stort sett?) under Network, og filtrer på XHR. Kan være at du har en feil i scriptet som gir en warning e.l., da blir det sent html/tekst i tillegg til en json streng, og det vil ikke fungere.

 

I tillegg kan du ha en feil i javascriptet.

 

Strip ned scriptene til det alle mest nødvendige, eller lag kun ett test script, slik at du er sikker på at du sender korrekt data frem og tilbake.

Lenke til kommentar

Prøvd inspiser element med google chrome i den ene javascript filen, får opp: Uncaught TypeError: Cannot read property 'menuAdds' of null. Får ikke opp flere feilmeldinger enn det, ingen JavaScript vil kjøre på nettsiden.. Om dere vil teste, så send meg en PM så får dere nettsiden.

Lenke til kommentar

hvis det er autoupdate som er samme fil som du la ut her, så lurer jeg på følgende: Hvor er get variablene i filen? Eller request variabler for den skyld? For ellers kan du jo ikke lese data sendt fra serveren via javascript

 

Og har du feilkjørt hele filen din? Kan det hende det er feil i filen som du ikke ser? Et tips er å alltid bruke feilmeldinger på mysql spørringer.

// F.eks
mysql_query("spørring her") or die(mysql_error());

Det er det jeg har å komme med sålangt

Lenke til kommentar

Hva skjer hvis du prøver å kalle opp denne filen direkte i nettleseren? Hvis alt er riktig skal du få en json kodet streng, da kan du sjekke at den er som forventet. Har du noen feil i skriptet så skal de vises (skru på error reporting om nødvendig).

 

Å bruke die() er neppe lurt i denne sammenhengen, det vil resultere i ren tekst som output i stedet for json, og da vil ting feile. try catch er nok bedre. Og i stedet for die(json_encode($result)); så bruk echo json_encode($result); ser mye bedre ut.

 

try {
// kode
mysql_query("spørring her") or throw new exception(mysql_error());
// mer kode
}
catch (Exception $e) {
$result['errmsg']=utf8_encode($e->getMessage());
}

echo json_encode($result);

 

jQuery

$.post('ajax.php',{test: 'test', alt: 1}, function(data) {
// debugging
console.log(data);

// behandle hvert felt i data
$.each(data, function (key, value) {
	switch (key) {
		case 'errmsg': alert(value); break;
		case 'data':
			// utfør ting for data;
			break;
		case 'class':
			// utfør ting for class;
			break;
	}
}

// alternativt til each med switch
if (typeof data.errmsg!='undefined') {
	// utfør feilmeldings håndtering
}
},'json');

 

Du kan også legge inn kommandoen console.log(variabel_navn_med_retur_php); for å hjelpe til med debuggingen, en grei måte å se innholdet i en variabel, spesielt arrays og objekter, i konsollen i nettleserens utviklerverktøy (firebug/dragonfly o.l.)

Endret av Crowly
Lenke til kommentar

Hva skjer hvis du prøver å kalle opp denne filen direkte i nettleseren? Hvis alt er riktig skal du få en json kodet streng, da kan du sjekke at den er som forventet. Har du noen feil i skriptet så skal de vises (skru på error reporting om nødvendig).

 

Å bruke die() er neppe lurt i denne sammenhengen, det vil resultere i ren tekst som output i stedet for json, og da vil ting feile. try catch er nok bedre. Og i stedet for die(json_encode($result)); så bruk echo json_encode($result); ser mye bedre ut.

 

try {
// kode
mysql_query("spørring her") or throw new exception(mysql_error());
// mer kode
}
catch (Exception $e) {
$result['errmsg']=utf8_encode($e->getMessage());
}

echo json_encode($result);

 

jQuery

$.post('ajax.php',{test: 'test', alt: 1}, function(data) {
// debugging
console.log(data);

// behandle hvert felt i data
$.each(data, function (key, value) {
	switch (key) {
		case 'errmsg': alert(value); break;
		case 'data':
			// utfør ting for data;
			break;
		case 'class':
			// utfør ting for class;
			break;
		}
	}

	// alternativt til each med switch
	if (typeof data.errmsg!='undefined') {
		// utfør feilmeldings håndtering
	}
},'json');

 

Du kan også legge inn kommandoen console.log(variabel_navn_med_retur_php); for å hjelpe til med debuggingen, en grei måte å se innholdet i en variabel, spesielt arrays og objekter, i konsollen i nettleserens utviklerverktøy (firebug/dragonfly o.l.)

 

Hei,

 

Skal prøve på det, også lager jeg ett innlegg her hvis det ikke fungerer.

Lenke til kommentar

Hvis du ikke får det til å fungere, så bør du lage deg noe enkel test kode som er helt uavhengig av hoved prosjektet. Slik at du får kontroll på hva som må gjøres i forhold til evt. rammeverk og syntaks både på klient (javascript) og server (php) siden. Når det fungerer, så overfører du metoden til hoved prosjektet.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...