2011-01-06 2 views
1

EDIT:PHP PDO функция запроса

Я правильно указываю ответ ниже из-за нашей беседы ниже. Не стесняйтесь публиковать ответ на неотвеченные части, и я обязательно вернусь сюда. Благодарю.

= - = - = - = - = - = - = - = -

Я пытаюсь иметь одну функцию обрабатывать все подготовленные заявления. В моем более раннем коде я был mysql_fetch_assoc-ing через выбранные запросы. Я хотел бы просто вернуть массив, если я делаю выбор и, возможно, lastInsertId или affectedRows или что-то еще, если я делаю Insert Update или Delete.

Мой вопрос, помимо разбора sql для «select» или «insert» или добавления другого параметра к функции типа $ type = «Select», есть что-то в классе PDO, который позволяет узнать, есть ли данные?

Я видел где-то, что вы можете проверить, вернётся ли значение, возвращаемое fetch или fetchAll. Это то, что я должен делать?

Я также открыт для любых отзывов о функции.

function pdo_query($sql,$data) 
{ 
$stmt = $dbh->prepare($sql); 
$first_row = true; 

if(is_array($data)){ 
    foreach($data as $row){ 
     if(is_array($row)){ 
      foreach($row as $param => $value){ 
       if($first_row){ 
        //http://bugs.php.net/43130 parameters can't have dashes 
        $stmt->bindParam($param, ${substr(str_replace('-','_',$param),1)}); 
       } 
       ${substr(str_replace('-','_',$param),1)} = $value; 
      } 
      $stmt->execute(); 
      $first_row = false; 
     } 
    } 
    while ($row = $stmt->fetch()) { 
     $return[] = $row; 
    } 
} 
return $return; 
} 

Edit: Я не пробовал еще, но есть ли тестирование проблемы для $ stmnt-> выборки()? Кроме того, если бы я хотел автоматизировать получение lastInsertId() или затронутых строк, мне кажется, что я не могу понять, какой тип запроса я делаю после факта. Вот где я нахожусь:

if ($rows = $stmt->fetchAll()) { 
     return $rows; 
    } else if (some_way_of_determining_if_an_insert_happened) { 
     return $dbh->lastInsertId(); 
    } else { 
     return some_way_of_returning_affected_rows 
    } 
} 
+0

Зачем беспокоиться о ручной привязке? почему бы просто не выполнить ($ data)? –

+0

Хмммм ... Я думал, что знаю. Мне нужно посмотреть, что такое привязка. Спасибо за ваш вклад. – Stephane

+0

У меня был аналогичный подход: http://stackoverflow.com/questions/3725879/fetchall-helper-function-using-pdo однако он принимает параметры inline, а не в массиве. например '$ db-> fetchAll (" SELECT * FROM table WHERE a =? AND b =? ", $ a, $ b)' dunno, что лучше. может быть, он должен проверить параметр, если он имеет тип массива и добавить его в результирующий массив значений –

ответ

2

Не чувствуйте себя слишком умным.

Сделать набор методов.

  • Общее из них - query, которое возвращает тип ресурса.
  • Набор помощников, который с помощью этого метода запроса возвращает скалярное значение, строку, столбец и набор строк.
  • Полезные методы, чтобы получить количество затронутых строк, возвращенные строки, вставить идентификатор и т. Д. Из заданного ресурса.

Также метод создания инструкции SET был бы полезен для использования со способами вставки и обновления. См this one для примера

Примеры:

//SELECT helpers: 
$username = $db->getOne("SELECT name FROM users WHERE id=?",$id); //getting scalar 
$userinfo = $db->getRow("SELECT * FROM users WHERE id=?",$id); //getting row 
$newsdata = $db->getAll("SELECT * FROM news LIMIT ?,?",$start,$rows); //getting array 

//Select for mass emailing 
$res = $db->query("SELECT * FROM notify WHERE topic_id = ?",$topic); 
$num = $db->numRows($res); 
while ($row = $db->next()){ 
    mail(...); 
} 

//insert 
$res = $db->query("INSERT INTO users SET name = ?",$name); 
$id = $db->lastId(); 

//delete 
$res = $db->query("DELETE FROM users WHERE id = ?",$id); 
$rows = $db->affectedRows(); 

Однако я не уверен affectedRows() и lastId методы, как их принимают идентификатор ссылки в качестве параметра, а не ресурс идентификатора ....

+0

Я понимаю вашу точку зрения, и вы изменили то, как я рассматриваю создание функций и методов. Спасибо. – Stephane

Смежные вопросы