Skocz do zawartości
  • 0
X3nO

Kod zamiast się wykonywać, wyświetla się

Pytanie

Witam, mam problem z zapytaniem (Już jestem przy książkach PHP xD), Zrobiłem select z bazy danych, ale kod zamiast się wykonywać tylko się pokazuje tylko w innej formie.

Mój kod:

		foreach ( \IPS\Db::i( 'samp_db' )->select( 'name, premium, score, lvl', 'Accounts',  array( "online>?", 0)) as $c ) {
			$online[] = $c;
			$nick = $c['name'];
			$id_online = \IPS\Db::i( 'samp_db' )->select( 'id, name', 'playersOnline', 'name=$nick');
		}

To co się wyświetla:

SELECT id, name FROM `playersOnline` WHERE name=$nick

Chodzi mi o $id_online

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

18 odpowiedzi na to pytanie

Polecane posty

  • 0

Nie

			$entry['serv'] = \IPS\Db::i( 'samp_db' )->select( 'name, premium, score, lvl', 'Accounts', array('name=?', $entry['name']))->first();
			if($entry['serv']['premium'] == 3) $ha++;
			else if($entry['serv']['premium'] == 2) $a++;
			else if($entry['serv']['premium'] == 1) $ja++;
			else if($entry['serv']['premium'] == 0) $v++;
			else if($entry['serv']['premium'] == -1) $g++;
			$count++;
$online[] = $entry;

Ale znowu używasz jakiś zmiennych ha, a, ja, v, g, count, których nie wykorzystujesz. Naprawdę nie zabieraj się za tą aplikację dopóki nie poznasz solidnych podstaw php

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 1

i prawidłowo :)

zamień to

$id_online = \IPS\Db::i( 'samp_db' )->select( 'id, name', 'playersOnline', 'name=$nick');

na

$id_online = \IPS\Db::i( 'samp_db' )->select( 'id, name', 'playersOnline', array('name=?', $nick))->first();

ale to i tak bez sensu bo przypisujesz do zmiennej której w pętli nie używasz, musisz dodać jeszcze try...catch

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 1

bo pewnie gdzieś przekazujesz tablicę. Musisz sobie to zweryfikować dokładniej

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 1

Zmienna $danekonta zawsze będzie ostatnim wpisem w danej tabeli.
Sortowanie ustawia się po WHERE czyli w Twoim przypadku po: array('name=?', $entry['name'])

PS: array w WHERE nie jest potrzebny, jeśli sprawdzasz tylko jedną kolumnę ("name = '{$entry['name']}'" będzie działać ;))

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 1
2 godziny temu, naXe napisał:

PS: array w WHERE nie jest potrzebny, jeśli sprawdzasz tylko jedną kolumnę ("name = '{$entry['name']}'" będzie działać ;))

Tak, ale czytelniej i ładniej wygląda array( 'name=?', $entry[ 'name' ]). To uczy pewnych nawyków i zapewnia większe bezpieczeństwo w przyszłości :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 1

Nie wykorzystujesz :) jeśli w pliku php zliczasz to musiałbyś je przekazać do szablonu, żeby je użyć, jeśli nie przekażesz to znaczy, że nie wykorzystujesz :)

dodatkowo kod if...elseif...else w tej postaci jest nie czytelny i purystyka każe użyć nawiasów klamrowych :) A idąc jeszcze dalej powinieneś użyć switch'a

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 1

1 problem = 1 temat :) nie wałkujmy każdych problemów z tą apką w jednym temacie bo będzie syf

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
3 minuty temu, Spanner napisał:

i prawidłowo :)

zamień to


$id_online = \IPS\Db::i( 'samp_db' )->select( 'id, name', 'playersOnline', 'name=$nick');

na


$id_online = \IPS\Db::i( 'samp_db' )->select( 'id, name', 'playersOnline', array('name=?', $nick))->first();

ale to i tak bez sensu bo przypisujesz do zmiennej której w pętli nie używasz, musisz dodać jeszcze try...catch

Teraz mam błąd (Wcześniej jak próbowałem z ->query też go miałem):
Whops\Exception\ErrorException thrown with message "htmlspecialchars() expects parameter 1 to be string, array given"

Używam w szablonie pętlę 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
		foreach ( \IPS\Db::i( 'samp_db' )->select( '*', 'playersOnline') as $entry ) {
			$online[] = $entry;
			$danekonta = \IPS\Db::i( 'samp_db' )->select( 'name, premium, score, lvl', 'Accounts', array('name=?', $entry['name']))->first();
		}

Zrobiłem teraz tak, ale tablica $danekonta wyświetla jedynie pierwszy rekord, na IPB 3 miałem tak i działało:

						foreach( $gracze['ponline'] as $entry ) {
							$danekonta = $this->registry->DB('acc')->buildAndFetch( array( 'select' => 'name, uid, premium, score, lvl', 
								'from'   => 'Accounts','where'  => 'name=\''.$entry['nickname'].'\'')); 		
									   
							$this->registry->DB('acc')->execute();
						}

@edit Jak się sortuje w tych zapytaniach? Chodzi mi o DSC/ASC

Edytowano przez X3nO

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Okej, dzięki naXe, a z tymi $danekonta to jak to powinno wyglądać? bo w szablonie mam 

		{{foreach $online as $c}}
			<tr class="ipsDataItem ipsClearfix">
				<td>{$c['id']}</td>
				<td>
					<a style="cursor: pointer;" data-ipsDialog data-ipsDialog-url='{url="app=gcp&module=main&controller=seeprofile&name={$c['name']}" seoTemplate="game"}' seoTemplate="gcp"}' data-ipsDialog-title='{$c['name']}'>
						{{if $danekonta['premium'] == 3}}
							<span style="color: red;"><i class="fa fa-star"></i>&nbsp;{$c['name']}</span>
						{{endif}}
						{{if $danekonta['premium'] == 2}}
							<span style="color: #0066CC;"><i class="fa fa-shield"></i>&nbsp;{$c['name']}</span>
						{{endif}}
						{{if $danekonta['premium'] == 1}}
							<span style="color: #65c902;"><i class="fa fa-gift"></i>&nbsp;{$c['name']}</span>
						{{endif}}
						{{if $danekonta['premium'] == 0}}
							<span style="color: #FDCA31;"><i class="fa fa-rocket"></i>&nbsp;{$c['name']}</span>
						{{endif}}
						{{if $danekonta['premium'] == -1}}
							<span style="color: #808080;"><i class="fa fa-user"></i>&nbsp;{$c['name']}</span>
						{{endif}}
					</a>
				</td>
				<td>{$c['score']}</td>
				<td>{$c['level']}</td>
			</tr>
		{{endforeach}}

Jak na razie nie wiem jak zrobić kolorowanie nicków na podstawie rang z IPS :/ 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

takie dane powinieneś mieć zapisane w zmiennej $online.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

No tak, ale $online pobiera graczy online a $danekonta pobiera range na serwerze więc nie wiem jak to wykorzystać

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Popatrz na kod w pierwszym poście. pobierasz dane i przypisujesz do zmiennej, która za każdym razem się nadpisuje, a możesz zapisać te dane do wiersza w zmiennej $online np w

$online[ 'server_status' ]

lepiej doczytaj książkę do końca :P

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Coś takiego?

		foreach ( \IPS\Db::i( 'samp_db' )->select( 'name, id', 'playersOnline', array('id>?', -1), 'id') as $entry ) {
			$online[] = $entry;
			$online['serv'] = \IPS\Db::i( 'samp_db' )->select( 'name, premium, score, lvl', 'Accounts', array('name=?', $entry['name']))->first();
			if($online['serv']['premium'] == 3) $ha++;
			else if($online['serv']['premium'] == 2) $a++;
			else if($online['serv']['premium'] == 1) $ja++;
			else if($online['serv']['premium'] == 0) $v++;
			else if($online['serv']['premium'] == -1) $g++;
			$count++;
		}
		{{foreach $online as $c}}
			<tr class="ipsDataItem ipsClearfix">
				<td>{$c['id']}</td>
				<td>
					<a style="cursor: pointer;" data-ipsDialog data-ipsDialog-url='{url="app=gcp&module=main&controller=seeprofile&name={$c['name']}" seoTemplate="game"}' seoTemplate="gcp"}' data-ipsDialog-title='{$c['name']}'>
						{{if $c['serv']['premium'] == 3}}
							<span style="color: red;"><i class="fa fa-star"></i>&nbsp;{$c['name']}</span>
						{{endif}}
						{{if $c['serv']['premium'] == 2}}
							<span style="color: #0066CC;"><i class="fa fa-shield"></i>&nbsp;{$c['name']}</span>
						{{endif}}
						{{if $c['serv']['premium'] == 1}}
							<span style="color: #65c902;"><i class="fa fa-gift"></i>&nbsp;{$c['name']}</span>
						{{endif}}
						{{if $c['serv']['premium'] == 0}}
							<span style="color: #FDCA31;"><i class="fa fa-rocket"></i>&nbsp;{$c['name']}</span>
						{{endif}}
						{{if $c['serv']['premium'] == -1}}
							<span style="color: #808080;"><i class="fa fa-user"></i>&nbsp;{$c['name']}</span>
						{{endif}}
					</a>
				</td>
				<td>{$c['serv']['score']}</td>
				<td>{$c['serv']['lvl']}</td>
			</tr>
		{{endforeach}}

Bo w szablonie $c['serv'] wyświetla się jako niezdefiniowana :/ Aż idę poszukać tego w książce :v

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
9 minut temu, Spanner napisał:

Nie


			$entry['serv'] = \IPS\Db::i( 'samp_db' )->select( 'name, premium, score, lvl', 'Accounts', array('name=?', $entry['name']))->first();
			if($entry['serv']['premium'] == 3) $ha++;
			else if($entry['serv']['premium'] == 2) $a++;
			else if($entry['serv']['premium'] == 1) $ja++;
			else if($entry['serv']['premium'] == 0) $v++;
			else if($entry['serv']['premium'] == -1) $g++;
			$count++;
$online[] = $entry;

Ale znowu używasz jakiś zmiennych ha, a, ja, v, g, count, których nie wykorzystujesz. Naprawdę nie zabieraj się za tą aplikację dopóki nie poznasz solidnych podstaw php

Ja je wykorzystuje w szablonie 

<h2 class="ipsType_sectionTitle ipsType_medium ipsType_reset ipsClear">{lang="game_online"}: <strong>{$count}</strong> (
	<span class="ipsBadge ipsBadge_medium" style="background-color: red" title="RCONi" data-ipsTooltip>{$ha}</span> | 
	<span class="ipsBadge ipsBadge_medium" style="background-color: #0066CC" title="Administratorzy" data-ipsTooltip>{$a}</span> | 
	<span class="ipsBadge ipsBadge_medium" style="background-color: #65c902" title="Junior Admini" data-ipsTooltip>{$ja}</span> | 
	<span class="ipsBadge ipsBadge_medium" style="background-color: #FDCA31" title="Gracze Premium" data-ipsTooltip>{$v}</span> | 
	<span class="ipsBadge ipsBadge_medium" style="background-color: #808080" title="Gracze" data-ipsTooltip>{$g}</span>)
</h2>

@edit  Dzięki wielkie, działa :D Ja się uczę na tej aplikacji, od czegoś trzeba zaczynać ;v

Edytowano przez X3nO

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
23 godziny temu, Spanner napisał:

Nie wykorzystujesz :) jeśli w pliku php zliczasz to musiałbyś je przekazać do szablonu, żeby je użyć, jeśli nie przekażesz to znaczy, że nie wykorzystujesz :)

dodatkowo kod if...elseif...else w tej postaci jest nie czytelny i purystyka każe użyć nawiasów klamrowych :) A idąc jeszcze dalej powinieneś użyć switch'a

Bo nie dawałem całej funkcji 

	protected function _online()
	{
		$online = [];
		$count = 0;
		$ha = 0;
		$a = 0;
		$ja = 0;
		$v = 0;
		$g = 0;

		foreach ( \IPS\Db::i( 'samp_db' )->select( 'name, id', 'playersOnline', array('id>?', -1), 'id') as $entry ) {
			$entry['serv'] = \IPS\Db::i( 'samp_db' )->select( 'name, premium, score, lvl', 'Accounts', array('name=?', $entry['name']))->first();
			switch ( $entry['serv']['premium'] )
			{
				case '3':
					$ha++;
					break;
				case '2':
					$a++;
					break;
				case '1':
					$ja++;
					break;
				case '0':
					$v++;
					break;
				case '-1':
					$g++;
					break;
			}
			$count++;
			$online[] = $entry;
		}
		
		return \IPS\Theme::i()->getTemplate( 'main' )->mainArea( $online, $count, $ha, $a, $ja, $v, $g );
	}	

Dzięki za radę :)

Mam kolejny problem, pewnie wynikający z mojej niskiej wiedzy na temat PHP :/

<?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 );
	}
}

Kod się nie wykonuje, tzn jest HTTP ERROR 500 :/

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Czyli temat można zamknąć, problem rozwiązany

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.