При создании метода в класе доступа к БД, часто необходимо выбрать только первую запись, при этом метод вернет хеш. Но если запрос типа - "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 поля. Потому мы всегда при необходимости возвратим хеш или просто переменную.
Это решение не претендует на полноту, так как класы по работе с БД сейчас довольно продвинутые (для ПХП), просто мне пришлось работать с проектом, где работа с БД реализована довольно примитивно. Но может это кому-то понадобится :)
Как по мне - довольно перегруженная функция получилась, можно сделать короче:
ОтветитьУдалить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 здесь лишний
Согласен
ОтветитьУдалить