среда, 22 октября 2008 г.

Особенности работы с mysql_fetch_array в PHP

При создании метода в класе доступа к БД, часто необходимо выбрать только первую запись, при этом метод вернет хеш. Но если запрос типа - "SELECT count(*) FROM users", то тут надо вернуть просто переменную.

Решение может быть следующие:

 function select_first($sql){
          $sql.=" LIMIT 1"  ;
          $sth = $this->execute($sql);
          $num = ($sth?mysql_num_rows($sth):0);
          if ($num == 1){
             $row = mysql_fetch_array($sth);
             if(sizeof($row)==2){
                 return $row[0];
             }else{
                return $row;
             }             
          }else{
             return false; 
          }   
        }         

Ключевым будет блок:

 if(sizeof($row)==2){
                 return $row[0];
             }else{
                return $row;
             }             

Здесь мы используем свойство  mysql_fetch_array, зная что возвратится хеш+просто массив. Например если бы мы вызвали метод с таким запросом: 

$res=select_first("SELECT name FROM users WHERE id=1");

то если допустим такой юзер есть и его имя Sergey, то:

$row['name'] = "Sergey" 
$row[0] ="Sergey"

SizeOf($row) = 2 в случае возврата 1 поля. Потому мы всегда при необходимости возвратим хеш или просто переменную.

Это решение не претендует на полноту, так как класы по работе с БД сейчас довольно продвинутые (для ПХП), просто мне пришлось работать с проектом, где работа с БД реализована довольно примитивно. Но может это кому-то понадобится :)


2 комментария:

  1. Как по мне - довольно перегруженная функция получилась, можно сделать короче:

    function select_first($sql){
    $sql.=" LIMIT 1" ;
    if(!$sth = $this->execute($sql)) return false;
    if($row = mysql_fetch_array($sth)) {
    return sizeof($row) == 2 ? $row[0] : $row;
    }
    return false;
    }

    mysql_fetch_array вернет falsе если запрос не вернет данных, поэтому вызов mysql_num_row здесь лишний

    ОтветитьУдалить