НЕ ПОПЫТАТЬСЯ автоматизировать все
Чем меньше магии в вашем коде, тем легче поддержки и менее болезненных неприятностей.
Не пытайтесь использовать всю логику в одном методе. Это класс! Вы можете создать столько методов, сколько вам нужно.
Когда вам нужно rowCount()
- выберите это явно! Это не так сложно.
Но когда вы натыкаетесь на этот код через пару месяцев, вы будете знать, что означает это значение.
Если вам нужна одна строка - используйте метод для получения одной строки. Когда вам нужно много строк - используйте метод, чтобы получить много строк.
Это просто и очень однозначно!
Когда вы включаете обратно в свой код после 2-х месяцев, вы будете иметь абсолютно никаких идей, что делали вы ожидали. Итак - всегда пишите это явно.
Вот отрывок из моей mysqli wrapper class, чтобы дать вам идею:
public function query()
{
return $this->rawQuery($this->prepareQuery(func_get_args()));
}
/**
* Helper function to get scalar value right out of query and optional arguments
*
* Examples:
* $name = $db->getOne("SELECT name FROM table WHERE id=1");
* $name = $db->getOne("SELECT name FROM table WHERE id=?i", $id);
*
* @param string $query - an SQL query with placeholders
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query
* @return string|FALSE either first column of the first row of resultset or FALSE if none found
*/
public function getOne()
{
$query = $this->prepareQuery(func_get_args());
if ($res = $this->rawQuery($query))
{
$row = $this->fetch($res);
if (is_array($row)) {
return reset($row);
}
$this->free($res);
}
return FALSE;
}
/**
* Helper function to get single row right out of query and optional arguments
*
* Examples:
* $data = $db->getRow("SELECT * FROM table WHERE id=1");
* $data = $db->getOne("SELECT * FROM table WHERE id=?i", $id);
*
* @param string $query - an SQL query with placeholders
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query
* @return array|FALSE either associative array contains first row of resultset or FALSE if none found
*/
public function getRow()
{
$query = $this->prepareQuery(func_get_args());
if ($res = $this->rawQuery($query)) {
$ret = $this->fetch($res);
$this->free($res);
return $ret;
}
return FALSE;
}
/**
* Helper function to get single column right out of query and optional arguments
*
* Examples:
* $ids = $db->getCol("SELECT id FROM table WHERE cat=1");
* $ids = $db->getCol("SELECT id FROM tags WHERE tagname = ?s", $tag);
*
* @param string $query - an SQL query with placeholders
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query
* @return array|FALSE either enumerated array of first fields of all rows of resultset or FALSE if none found
*/
public function getCol()
{
$ret = array();
$query = $this->prepareQuery(func_get_args());
if ($res = $this->rawQuery($query))
{
while($row = $this->fetch($res))
{
$ret[] = reset($row);
}
$this->free($res);
}
return $ret;
}
/**
* Helper function to get all the rows of resultset right out of query and optional arguments
*
* Examples:
* $data = $db->getAll("SELECT * FROM table");
* $data = $db->getAll("SELECT * FROM table LIMIT ?i,?i", $start, $rows);
*
* @param string $query - an SQL query with placeholders
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query
* @return array enumerated 2d array contains the resultset. Empty if no rows found.
*/
public function getAll()
{
$ret = array();
$query = $this->prepareQuery(func_get_args());
if ($res = $this->rawQuery($query))
{
while($row = $this->fetch($res))
{
$ret[] = $row;
}
$this->free($res);
}
return $ret;
}
Look - от имени функции вы всегда можете сказать, результат которой ожидать:
$name = $db->getOne('SELECT name FROM table WHERE id = ?i',$_GET['id']);
$data = $db->getAll("SELECT * FROM ?n WHERE mod=?s LIMIT ?i",$table,$mod,$limit);
Не одурачить такой ловушкой, как количество возвращенных строк.
В наборе результатов может быть честный один ряд, который вы намереваетесь заполнить fetchAll
. Таким образом, он будет возвращать одномерный массив вместо многомерного, и на вашей странице будет много видеоэффектов.
Почему бы вам не просто fetchall()? Если есть только одна строка, вы получите один ... – Ben
Потому что я думал, что могу избежать цикла. С fetchall я должен использовать цикл, даже если есть только один результат. –
что здесь делает mysql_real_escape_string? вы правильно форматируете «creditcards»? –