Автор Тема: Тия два кода еднакви ли са?  (Прочетена 6912 пъти)

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
Тия два кода еднакви ли са?
« Отговор #15 -: Oct 21, 2008, 16:46 »
Относто swich-a...
Един човек който разбера повече от мен е написал тука за swich-a:
"в много случаи имплементира обект от data layer в application layer - както е в този случай "
И ето защо се получават "колизии" или не работещ код както иска "програмиста". Това се получава при недостатъчна компетентност на задклавиатурното устройство.

Затова и аз зададох тоя въпрос тука, е се радвам на дискусията.
Активен

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Тия два кода еднакви ли са?
« Отговор #16 -: Oct 21, 2008, 17:53 »
мдааааа
примера в wikipedia е доста добър наистина - наследяването и класовете там са доста по-добро решение от ползването на условна конструкция
друг е въпроса, че ако сайта, който се прави не ползва ООП възможностите на РНР аз лично не бих се сетил за такъв подход за превключването между езиците - не казвам, че не е правилно, а просто, че аз не бих се сетил '<img'>
Активен

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
Тия два кода еднакви ли са?
« Отговор #17 -: Oct 28, 2008, 15:46 »
Примерен код

<?php
session_start();

$languageFileMapping = Array('ru' => 'ru', 'bg' => 'bg', 'en' => 'en');
$defaultLanguage = 'en';

if (empty($_SESSION['lang']))
{
  $parsedLanguages = explode(',', $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
  foreach ($parsedLanguages as $parsedLanguage)
  {
      $language = substr($parsedLanguage, 0, 2);
      if (array_key_exists($language, $languageFileMapping))
      {
$_SESSION['lang'] = $language;
break;          
      }
  }
}

if (empty($_SESSION['lang']))
{
$_SESSION['lang'] = $defaultLanguage;
}

if ($_GET[lang])
{
if (array_key_exists($_GET[lang], $languageFileMapping))
{
$_SESSION['lang'] = $_GET[lang];
}
}

include($_SERVER['DOCUMENT_ROOT']."/include/".$languageFileMapping[$_SESSION['lang']].".php");
...
...
Кода продължава тука с други неща...
...
...
?>

На този код тихомълком се получава едно ерорче:
Цитат

Warning: array_key_exists() [function.array-key-exists]: The first argument should be either a string or an integer in /your-sitepath/wp-includes/category-template.php on line 176

This problems stems from line 176 as stated above - some people have said that updating their wordpress theme worked, however, a simple change to line 176 seems to work perfectly.

Change line 176 from:

if(array_key_exists($category, $categories))

To

if(array_key_exists('$category', $categories))

Don’t see the difference? Just add single quotes around the first $category variable. Make sure they are not the curly single quotes.

Това е ерорчето за което говорят и при мене се получава тогава:
Примерен код
<?php
session_start();

$languageFileMapping = Array('ru' => 'ru', 'bg' => 'bg', 'en' => 'en');
$defaultLanguage = 'en';

if (empty($_SESSION['lang']))
{
  $parsedLanguages = explode(',', $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
  foreach ($parsedLanguages as $parsedLanguage)
  {
      $language = substr($parsedLanguage, 0, 2);
      if (array_key_exists('$language', $languageFileMapping))

Т.е. поставих едни единични скобички и "спи градъ и циганьете краднат..."
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Тия два кода еднакви ли са?
« Отговор #18 -: Oct 28, 2008, 16:40 »
Доста странно (да не използвам други думички) предложение за отстраняване на бъга.
Използването на единични кавички в PHP означава: стрингът да НЕ се обработва за променливи и специални символи (прим. \n ,\r и т.н.).
Т.е., изходът от този фрагмент:
Код
GeSHi (PHP):
  1. $var = 'value';
  2. echo '$var';
е точно $var,  а не value.

С други думи, използването на това решение (array_key_exists('$category', $categories)) ще води ВИНАГИ до търсенето на ключ, който е '$category', а не '{стойността на $category}' ...

По-скоро направи малко дебъг, сложи един var_dump($language) преди if-a с array_key_exists и виж за какво става въпрос когато излиза тази грешка.
Най-вероятно е да се окаже, че $language е празен стринг.
« Последна редакция: Oct 29, 2008, 15:30 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
Re: Тия два кода еднакви ли са?
« Отговор #19 -: Oct 29, 2008, 10:32 »
Код
GeSHi (PHP):
  1. if (empty($_SESSION['lang']))
  2. {
  3.   $parsedLanguages = explode(',', $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
  4.   foreach ($parsedLanguages as $parsedLanguage)
  5.   {
  6.       $language = substr($parsedLanguage, 0, 2);
  7.   var_dump($language);
  8.   if (empty($language))
  9.   {
  10. echo ("1");
  11. break;
  12.   }
  13.   else
  14.   {  
  15.       if (array_key_exists($language, $languageFileMapping))
  16.       {
  17. echo ("2");
  18. $_SESSION['lang'] = $language;
  19. break;          
  20.       }
  21. }
  22.   }
  23. }
  24.  
Така е решен проблема според мен? Правилно ли съм го "разгънал" кода?  var_dump($language); е добре когато браузъра подава език. Но пробвах с Гугъл Хрома да премахна всички езици и тогава и вар_дъмп казава че няма стойност променливата и array_key_exists реве, реве, реве че няма стойност променливата. Аз се заех да осигуря ВИНАГИ стойност на променливата която ще се подава на array_key_exists и разклоних логиката. Така правилно ли е? При мене кода вече работи без тази забележима грешка. Даже сложих ехо1, ехо2 за да виждам в кой клон на логиката съм отишъл в зеависимост от входните данни.
« Последна редакция: Oct 29, 2008, 13:32 от VladSun »
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Тия два кода еднакви ли са?
« Отговор #20 -: Oct 29, 2008, 13:35 »
Най-лесно е само да проверяваш за стойността му:
Код
GeSHi (PHP):
  1. if (!empty($language) && array_key_exists($language, $languageFileMapping))

В случай, че нищо не определи езика, най-накрая се изпълнява принудителното задаване на default езика.

ПП: Тъй като скоро ме направиха модератор на тази секция е редно да помодераторствам :) :) :P
Редактирах ти съобщението така, че да използва code=php и съответното синтактично оцветяване :)
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Тия два кода еднакви ли са?
« Отговор #21 -: Oct 30, 2008, 14:38 »
Разделяне на темата:
http://www.linux-bg.org/forum/index.php?topic=33005.0
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P