PDO: можно ли избежать bindParam? - PullRequest
0 голосов
/ 03 марта 2011

Я где-то изменил этот код, но я не уверен, правильно ли я это делаю,

Я использую метод для вставки данных в базу данных,

# insert or update data
    public function query($query, $params=array())
    {
        try
        {
            $stmt = $this->connection->prepare($query);
            $params = is_array($params) ? $params : array($params);
            $stmt->execute($params);
            return true;
        }
        catch (PDOException $e) 
        {
            # call the get_error function
            $this->get_error($e);
        }
    }

Тогда мне просто нужноНазовите это так,

$sql = "
    INSERT root_countries_cities_towns (
        tcc_names,
        cny_numberic,
        tcc_created
    )VALUES(
        ?,
        ?,
        NOW()
    )";

$pdo->query($sql,array('UK','000'));

Отлично работает отлично!но я не понимаю, что делает эта строка - может кто-нибудь объяснить, пожалуйста?

$params = is_array($params) ? $params : array($params);

Я думал, что сначала я должен использовать bindParam, чтобы связать параметры, но, похоже, я не должен;больше с методом is - это безопасно и безопасно тогда ??

Значит ли это, что мне больше не нужно готовить запрос таким образом?

$sql = "
        INSERT root_countries_cities_towns (
            tcc_names,
            cny_numberic,
            tcc_created
        )VALUES(
            :name,
            :numberic,
            NOW()
        )";

и забыли про эту привязку?

$stmt = bindParam(':name','UK', PDO::PARAM_STR);
$stmt = bindParam(':numberic','000', PDO::PARAM_STR);

Спасибо.

Ответы [ 5 ]

3 голосов
/ 03 марта 2011

Полагаю, это вопрос синтаксиса PHP, а не PDO.

$params = is_array($params) ? $params : array($params);

- это шортленд (называемый троичный оператор )) для

if (is_array($params)) {
   $params = $params;
} else {
  $params = array($params);
}

который я бы лучше написал как

if (!is_array($params)) $params = array($params);

, который довольно понятен и может быть прочитан почти на простом английском языке:

если $ params не является массивом, давайте сделаем его массивом с одним значением из предыдущих $ params

Вот почему я ненавижу троичный оператор (и лямбды) и всегда избегаю его использования. Это превращает довольно читаемый код в беспорядок. Просто из-за лени программиста.

Чтобы ответить на другие ваши вопросы,

Значит ли это, что мне больше не нужно готовить запрос таким образом?

Кто это сказал? Вы все готовите прямо в своем коде, проверьте это снова.

и забыли об этой привязке?

это правда. execute($params) - это просто еще один способ связывания переменных.

3 голосов
/ 03 марта 2011

строка

$params = is_array($params) ? $params : array($params);

просто проверяет, является ли переменная $ params массивом, и, если это так, создает массив с исходным значением $ params в качестве единственного элемента и назначает массив$ params.

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

Причина, по которой он не использует bindParam, заключается в том, чтопотому что значения передаются в метод execute ().С PDO у вас есть несколько методов для привязки данных к заполнителям:

  • bindParam
  • bindValue
  • execute ($ values)

Большим преимуществом метода bindParam является то, что если вы зацикливаетесь на массиве данных, вы можете один раз вызвать bindParam, чтобы привязать заполнитель к определенному имени переменной (даже если эта переменная еще не определена), и он получит текущийзначение указанной переменной при каждом выполнении оператора.

1 голос
/ 03 марта 2011

Первый пример преобразует содержимое вашего $params в массив, если он еще не был массивом (например, если был передан только один параметр, и он был передан как отдельный элемент, а не как массив длины). 1).

Оба примера работают одинаково, за исключением того, что для первого параметры, введенные с массивом $params, вводятся там, где в запросе SQL найдено ?, тогда как во втором - форматирование параметров на самом деле делается по имени (вы привязываете имя параметра, найденное в sql, к фактическому параметру).

Вы должны использовать первый, легче писать.

0 голосов
/ 03 марта 2011

Попробуйте этот класс.Я часто использую PDO, и это то, что я использую все время для своих проектов. Класс PHP PDO на GitHub

0 голосов
/ 03 марта 2011

Передача массива в PDOStatement::execute() пропускает каждую запись в массиве через PDOStatement::bindParam() (или, может быть, bindValues()) с использованием значений по умолчанию (тип привязки и т. Д.).

В принципе, это так же безопасно, как и досвязывание.

Преимущество использования bindParam заключается в том, что оно привязывается к ссылке на переменную.Это означает, что вы можете изменить значение переменной без повторного связывания и выполнить оператор с новыми значениями.Это особенно полезно в цикле, например

$vals = array('foo', 'bar', 'baz');
$stmt->bindParam(1, $val);
foreach ($vals as $val) {
    $stmt->execute(); // Executes once for each value in $vals
}

Я не понимаю, что делает эта строка - может кто-нибудь объяснить, пожалуйста?

Эта строкапреобразует не массив в массив.

Например,

$params = 'foo';
$params = is_array($params) ? $params : array($params);
$params == array('foo');

Я предполагаю, что это облегчает ситуации, когда у вас есть только один заполнитель и одно значение для привязки, так как PDOStatement::execute() может быть толькопередал массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...