Я правильно указываю ответ ниже из-за нашей беседы ниже. Не стесняйтесь публиковать ответ на неотвеченные части, и я обязательно вернусь сюда. Благодарю.
= - = - = - = - = - = - = - = -
Я пытаюсь иметь одну функцию обрабатывать все подготовленные заявления. В моем более раннем коде я был 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
}
}
Зачем беспокоиться о ручной привязке? почему бы просто не выполнить ($ data)? –
Хмммм ... Я думал, что знаю. Мне нужно посмотреть, что такое привязка. Спасибо за ваш вклад. – Stephane
У меня был аналогичный подход: http://stackoverflow.com/questions/3725879/fetchall-helper-function-using-pdo однако он принимает параметры inline, а не в массиве. например '$ db-> fetchAll (" SELECT * FROM table WHERE a =? AND b =? ", $ a, $ b)' dunno, что лучше. может быть, он должен проверить параметр, если он имеет тип массива и добавить его в результирующий массив значений –