Skocz do zawartości
  • 0
X3nO

Error HTTP 500 przy zapytaniach MySQL

Pytanie

Cześć, mam problem z errorem HTTP 500 przy zapytaniach MySQL w widgecie, mianowicie z funkcją render

<?php
/**
 * @brief		gameStats Widget
 * @author		<a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
 * @copyright	(c) 2001 - 2016 Invision Power Services, Inc.
 * @license		http://www.invisionpower.com/legal/standards/
 * @package		IPS Community Suite
 * @subpackage	gcp
 * @since		02 Jun 2016
 * @version		SVN_VERSION_NUMBER
 */

namespace IPS\gcp\widgets;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * gameStats Widget
 */
class _gameStats extends \IPS\Widget
{
	/**
	 * @brief	Widget Key
	 */
	public $key = 'gameStats';
	
	/**
	 * @brief	App
	 */
	public $app = 'gcp';
		
	/**
	 * @brief	Plugin
	 */
	public $plugin = '';
	
	/**
	 * Initialise this widget
	 *
	 * @return void
	 */ 
	public function init()
	{
		$settings['sql_host'] = \IPS\Settings::i()->serverdm_host;
		$settings['sql_user'] = \IPS\Settings::i()->serverdm_user;
		$settings['sql_pass'] = \IPS\Settings::i()->serverdm_password;
		$settings['sql_database'] = \IPS\Settings::i()->serverdm_database;

		\IPS\Db::i( 'samp_db', $settings );

		parent::init();
	}

	/**
	 * Render a widget
	 *
	 * @return	string
	 */
	public function render()
	{
		$wynik = \IPS\Db::i( 'samp_db' )->select('playerrecords_day, playerrecords, connects', 'config', array('connects>?', -1), 1);
		$acc = \IPS\Db::i( 'samp_db' )->select('count(*)', 'Accounts');
		$o = \IPS\Db::i( 'samp_db' )->select('count(*)', 'playersOnline');

		return \IPS\Theme::i()->getTemplate( 'widgets' )->gameStats( $acc, $o, $wynik );
	}
}

I szablon: 

<ips:template parameters="$acc, $o, $wynik" />
<h3 class="ipsType_reset ipsWidget_title">{lang="gamecp_info"}</h3>
<div class="ipsWidget_inner">
	<div class="ipsGrid ipsGrid_collapsePhone ipsWidget_stats">';
		<div class="ipsGrid_span2 ipsType_center">
			<span class="ipsType_large ipsWidget_statsCount">{$acc['count(*)']}</span><br>
			<span class="ipsType_light ipsType_medium"><i class="fa fa-check-square-o"></i> {lang="game_accounts"}</span>
		</div>
		<div class="ipsGrid_span2 ipsType_center">
			<span class="ipsType_large ipsWidget_statsCount">{$o['count(*)']}</span><br>
			<span class="ipsType_light ipsType_medium"><i class="fa fa-dot-circle-o"></i> {lang="game_online"}</span>
		</div>
		<div class="ipsGrid_span3 ipsType_center">
			<span class="ipsType_large ipsWidget_statsCount">{$wynik['playerrecords_day']}</span><br>
			<span class="ipsType_light ipsType_medium"><i class="fa fa-gamepad"></i> {lang="game_pday"}</span>
		</div>
		<div class="ipsGrid_span2 ipsType_center">
			<span class="ipsType_large ipsWidget_statsCount">{$wynik['playerrecords']}</span><br>
			<span class="ipsType_light ipsType_medium"><i class="fa fa-globe"></i> {lang="game_pglobal"}</span>
		</div>
		<div class="ipsGrid_span2 ipsType_center">
			<span class="ipsType_large ipsWidget_statsCount">{$wynik['connects']}</span><br>
			<span class="ipsType_light ipsType_medium"><i class="fa fa-mouse-pointer"></i> {lang="game_visits"}</span>
		</div>
	</div>
</div>

Z góry dziękuję za pomoc

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

9 odpowiedzi na to pytanie

Polecane posty

  • 0

aaaa, kurde mój błąd przepraszam. Jak zwracasz jedno pole w select z first() to wartość jest bezpośrednio w zmiennej, czyli samo $zmienna i będzie działać. Sorki za wprowadzenie w błąd :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
  1. jeśli pobierasz tylko jeden wynik to powinieneś użyć:
    \IPS\Db::i(...)->select(...)->first();

    i powinno to być zamknięte w try...catch

  2. jeśli robisz zapytanie z count(*) to jak już to daj alias np:

    count(*) as "amount"

    będzie lepiej tego używać w szablonie

  3. zapytanie count(*) jest mało optymalne lepiej jest dać count(id) gdzie id to nazwa pola z kluczem głównym

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
9 minut temu, Spanner napisał:
  1. jeśli pobierasz tylko jeden wynik to powinieneś użyć:
    
    \IPS\Db::i(...)->select(...)->first();

    i powinno to być zamknięte w try...catch

  2. jeśli robisz zapytanie z count(*) to jak już to daj alias np:

    
    count(*) as "amount"

    będzie lepiej tego używać w szablonie

  3. zapytanie count(*) jest mało optymalne lepiej jest dać count(id) gdzie id to nazwa pola z kluczem głównym

Chyba dobrze zrozumiałem 

	public function render()
	{
		$wynik = \IPS\Db::i( 'samp_db' )->select('playerrecords_day, playerrecords, connects', 'config')->first();
		$acc = \IPS\Db::i( 'samp_db' )->select('count(uid) as "amount"', 'Accounts')->first();
		$o = \IPS\Db::i( 'samp_db' )->select('count(id) as "amount"', 'playersOnline')->first();

		return \IPS\Theme::i()->getTemplate( 'widgets' )->gameStats( $acc, $o, $wynik );
	}

I nadal jest error 500

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

dobrze zrozumiałeś ale brakuje try...catch jeszcze :) zobacz w logi w panelu admina co pisze na temat błędu

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Problemem było

return \IPS\Theme::i()->getTemplate( 'widgets' )->gameStats( $acc, $o, $wynik );

poprawnie:

return $this->output( $acc, $o, $wynik );

Ale jest jeszcze problem, tak działa:

	$acc = \IPS\Db::i( 'samp_db' )->query("SELECT count(*) FROM Accounts");
	$acc = mysqli_fetch_assoc($acc);
	$o = \IPS\Db::i( 'samp_db' )->query("SELECT count(*) FROM playersOnline");
	$o = mysqli_fetch_assoc($o);
		$acc = \IPS\Db::i( 'samp_db' )->select('count(uid) as "amount"', 'Accounts')->first();
		$o = \IPS\Db::i( 'samp_db' )->select('count(id) as "amount"', 'playersOnline')->first();

a tak nie, rekord się nie pokazuje :/

Edytowano przez X3nO

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

a jak go pokazujesz? bo już nie będzie w szablonie widoczny jako

$zmienna[ 'count(*)' ]

tylko jako

$zmienna[ 'amount' ]

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Właśnie wyświetlam ją jako amount

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Dzięki wielkie, problem rozwiąany, jeszcze raz bardzo dziękuję :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość
Temat jest zablokowany i nie można w nim pisać.

  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.

×

Ważne informacje

Kontynuując przeglądanie strony, wyrażasz zgodę na używanie przez nas plików cookies.