Ошибка на уровне объектов и функций

1. YouMobe (08.11.2013 / 15:12)
Пишу скрипт вывода информации из БД:
<?php
/**   
 *  ПК - пользователей, общая характеристика компьютера.
 */ 

    $sql = 'SELECT * FROM `users_pc`';
    $result = $mysqli->query($sql); // Запрос посредством php+mysql(i) в БД
	$row = $result->fetch_assoc(); // Преобразование результата даных полученых с БД в ассоциативный массив
	
	echo '<table class="table table-bordered">';
	foreach($row as $key => $value){
		echo '<tr><td>'.$key.':</td><td> <strong>'.$value.' </strong></tr>';
		
    }
	echo '</table>';
	
?> 
, теперь тоже самое только в функции..
 <?php
/**   
 *  ПК - пользователей, общая характеристика компьютера.
 */ 

    $sql = 'SELECT * FROM `users_pc`';
    showPC($sql);

function showPC($sql){
    $result = $mysqli->query($sql); // Запрос посредством php+mysql(i) в БД
	$row = $result->fetch_assoc(); // Преобразование результата даных полученых с БД в ассоциативный массив
	return $row;
}

	echo '<table class="table table-bordered">';
	foreach($row as $key => $value){
		echo '<tr><td>'.$key.':</td><td> <strong>'.$value.' </strong></tr>';
		
    }
	echo '</table>';
	
?> 
а тут уж выводит ошибку: Fatal error: Cannot redeclare showPC() (previously declared in /home/suleiman/www/app/functions.php:8) in /home/youmobe/www/app/pc.php on line 13
Помогите решить проблему, почему при помощи функции не работает скрипт и выдает ошибку)

2. юЮЮфюв (08.11.2013 / 15:17)
Ты же функцию вызываешь до её описания

3. YouMobe (08.11.2013 / 15:22)
TakteS (8 Ноября 2013 / 15:17)
Ты же функцию вызываешь до её описания
А что есть разница?), в PHP разницы нет где описывать до или после, все равно так же будет.

4. Ant0ha (08.11.2013 / 15:23)
Где то уже определена эта функция.

5. YouMobe (08.11.2013 / 15:24)
Ant0ha (8 Ноября 2013 / 15:23)
Где то уже определена эта функция.
А вот это в полне возможно, щас просмотртю везде... Так оно и есть)
но теперь вылетела другая ошибка свзянанно с объектом походу
Notice: Undefined variable: mysqli in /home/youmobe/www/app/pc.php on line 10

Fatal error: Call to a member function query() on a non-object in /home/youmobe/www/app/pc.php on line 10

Добавлено через 08:07 сек.
Ошибка указывает на эту строку $result = $mysqli->query($sql); // Запрос посредством php+mysql(i) в БД

6. Михаил (08.11.2013 / 16:02)
В функциях по-умолчанию локальная область видимости переменных, ты берешь данные из глобальной переменной. Либо передавай в функцию еще и переменную $mysqli, либо в функции пиши global $mysqli;

7. YouMobe (08.11.2013 / 18:30)
Flyd (8 Ноября 2013 / 16:02)
В функциях по-умолчанию локальная область видимости переменных, ты берешь данные из глобальной переменной. Либо передавай в функцию еще и переменную $mysqli, либо в функции пиши global $mysqli;
Блин, чёт не выходит, скиньте годный мануал или статью, хочу понять что я не так делаю..
это $mysql->query($sql) напишите аналог как еще вызвать mysqli
или в этой функции в глобал вынести

8. Александр (08.11.2013 / 19:00)
function (....)
{
global $mysqli;
......
дальше все так же.
только не пинать.
я знаю, что многие не рекомендуют использовать global

9. YouMobe (08.11.2013 / 23:27)
rastoman (8 Ноября 2013 / 19:00)
function (....)
{
global $mysqli;
......
дальше все так же.
только не пинать.
я знаю, что многие не рекомендуют использовать global
Это то понятно,а есть альтернатиное решение?) может по другому организовать?

10. Артур (08.11.2013 / 23:44)
Тебе, автор, нужно конкретезировать цели

11. YouMobe (09.11.2013 / 00:22)
Башка (8 Ноября 2013 / 23:44)
Тебе, автор, нужно конкретезировать цели
Просто этот вариант не заработал, вышла другая ошибка
Цель: Хочу занести в функцию
 $sql = 'SELECT * FROM `users_pc`';
 $result = $mysqli->query($sql); // Запрос посредством php+mysql(i) в БД
 $row = $result->fetch_assoc(); // Преобразование результата даных полученых с БД в ассоциативный массив 
не знаю почему то выходит ошибка. Может хотябы методом ООП покажешь как можно организовать это?

12. Артур (09.11.2013 / 15:31)
Ну тебе ответили: переменной $mysqli в области видимости функции нет, вот оно и ругается. Или используй global или реализуй Локатор служб. Пример приведу:
class Services{
  private $services = [];
  private $object;

  private function __construct(){}

  public static function getInstance(){
    if(is_null($this->object)){
      $this->object = new self;
    }
    return $this->object;
  }

  public function getService($name){
    switch($name){
      case 'mysqli':
        if(!isset($this->services[$name])){
          $this->services[$name] = new MySQLi(...);
        }
        break;
    }
    $this->services[$name];
  }
}

function syncPC(...){
  $mysqli = Services::getInstance()->getService('mysqli');
  ...
}
На ошибки не проверял

URL: https://visavi.net/topics/39431