2015-06-03 2 views
1

Я всегда использую ту же переменную для моих утверждений запроса PDO, например:

// Query 1 
$stmt = $db->prepare("UPDATE table_1 SET name=? WHERE somthing=?"); 
$stmt->bindValue(1, $name, PDO::PARAM_STR); 
$stmt->bindValue(2, $something, PDO::PARAM_STR); 
$stmt->execute(); 


// Query 2 (right after the above) 
$stmt = $db->prepare("UPDATE table_2 SET another_column=? WHERE id=?"); 
$stmt->bindValue(1, $another_column, PDO::PARAM_STR); 
$stmt->bindValue(2, $id, PDO::PARAM_INT); 
$stmt->execute(); 

Я знаю, что это нормально для первых линий ($stmt = $db->...), мои сомнения о связывании значения. Например, если я забыл связать что-то в первом запросе, мой запрос будет использовать следующую привязку во втором запросе (или наоборот)? или все сбрасывается после execute()?

Какая из них лучше?

  1. Используя ту же переменную, чтобы избежать ошибок (например, Всегда $ STMT)
  2. Использование различных переменных

ответ

3

Использование различных переменных упрощает отладку, однако я делаю это время от времени, потому что это проще набрать -Написать одно утверждение.

Мое сомнение касается значений привязки.

каждый db->prepare() возвращает новый \PDOStatement, поэтому нет никаких проблем с привязкой.

+1

Различные переменные также упрощают обслуживание. Скажем, изменилась ли логика, и вам нужно получить доступ к первому «PDOStatement» после того, как вы уже присвоили переменную '$ stmt'. – topher

+1

@topher: Я бы назвал это сложнее, если у меня есть куча переменных _ just in case_. Ряд этих заявлений в любом случае не будет полезен. – cHao

0

Я бы предпочел снять $stmt после каждого запроса. Поэтому мне не нужно беспокоиться обо всех вещах, о которых вы говорили выше.

// Query 1 
$stmt = $db->prepare("UPDATE table_1 SET name=? WHERE somthing=?"); 
$stmt->bindValue(1, $name, PDO::PARAM_STR); 
$stmt->bindValue(2, $something, PDO::PARAM_STR); 
$stmt->execute(); 


unset($stmt); 

// Query 2 (right after the above) 
$stmt = $db->prepare("UPDATE table_2 SET another_column=? WHERE id=?"); 
$stmt->bindValue(1, $another_column, PDO::PARAM_STR); 
$stmt->bindValue(2, $id, PDO::PARAM_INT); 
$stmt->execute(); 

Также его отличная практика для отмены переменной, которая больше не требуется.

+0

Может ли кто-нибудь поддержать это, пожалуйста? Я также иногда делаю такие вещи из-за моих сомнений, поэтому я думал, что должен спросить, может быть, такие действия не требуются вообще? – Vladimir

+2

@Ara: Они не требуются. Новый объект, хранящийся в '$ stmt', заменяет старое значение, привязки и все. – cHao

+1

Зачем беспокоиться о 'unset()'? В сборке мусора, как только объект «PDOStatement» [больше не имеет ссылок на него] (http://blog.ircmaxell.com/2014/12/what-about-garbage.html), он автоматически удаляется. – Machavity

1

В подобных случаях разные операторы, используемые в той же области действия, я выбираю более конкретные имена для операторов.

Так что в вашем случае я бы назвал их $stmtUpdTable1 и $stmtUpdTable2 или что-то в этом роде.

Поскольку я не могу прокомментировать другие ответы: я думаю, что нет необходимости отменять переменные, которые больше не используются, сборщик мусора будет выполнять свою работу. Не нужно делать код messy

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