PHP PDO bindValue () без явного типа данных

0

Я работаю над приложением, использующим PHP-объект, ориентированный на PDO. Я много часов изо всех сил пытался найти причину неудачи моего запроса. Оказалось, что я поставил значение в качестве параметра в формате String для привязки в массиве. У меня есть общий цикл, который связывает все параметры с заполнителем вопросительного знака для моего запроса. Это, конечно, рассмотрит все параметры в формате String. Однако у меня есть столбцы в целочисленном формате. Даже когда я intval() переменную целому, используя (int) или intval(), это не сработало. Поэтому я считаю, что я должен указать явный тип данных для PDO::PDO_PARAM_INT. Но у меня есть код что-то вроде этого для всех запросов:

Пример запроса:

$this->db->query("INSERT INTO users (name, numberOfCar") VALUES (?,?) ,
                  array('Jake', 5));

Часть bindValue():

$x = 1;
if( count($params) ){
    foreach($params as $param){
        $this->_query->bindValue($x, $param);
        $x++;
    }
}

Как мне пойти с этим? Я имею в виду любую идею, как я могу изменить код, чтобы ответить на эту проблему? Не уверен, нужно ли мне модифицировать часть кода, но я озадачен, чтобы подумать об этом. Заранее спасибо.

EDIT: PHP версия 5.3.10, PDO подключиться к Sybase

  • 0
    Я просто добавляю его сюда без тестирования, но это должно сработать: $query = $this->db->prepare("INSERT INTO users (name, numberOfCar") VALUES (:values)") , затем $query->execute(array('values' => array('Jake', 5)));
  • 0
    Я не могу использовать этот вид решения, поскольку есть некоторые столбцы, которые имеют фиксированное значение.
Теги:
oop
pdo
bindvalue

2 ответа

0

Кажется, мне все еще нужно предоставить явный тип данных. Поэтому я придумал свое решение. Вот как я это сделал:

$this->db->query("INSERT INTO users (name, numberOfCar") VALUES (?,?) ,
              array('Jake', 5),
              array(PDO::PARAM_STR, PDO::PARAM_INT));

Для привязки значений:

$x = 1;
if( count($params) ){
    foreach($params as $param){
        $this->_query->bindValue($x, $param, $datatypes[$x-1]);
        $x++;
    }
}

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

0

Я не могу воспроизвести проблему, используя php 5.6.3, mysql5.6, win32

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');  
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setup($pdo);

$stmt = $pdo->prepare("INSERT INTO soFoo_users (name, numberOfCar) VALUES (?,?)");
foreach( array('Jake', 5) as $i=>$v) {
    $stmt->bindValue($i+1,  $v);
}
$stmt->execute();
$stmt = null;

foreach($pdo->query('SELECT * FROM soFoo_users', PDO::FETCH_ASSOC) as $r ) {
    echo join(', ', $r), "\r\n";
}

function setup($pdo) {
    $pdo->exec('
        CREATE TEMPORARY TABLE soFoo_users (
            name varchar(32),
            numberOfCar int
        )
    ');
}

печать

Jake, 5

как и ожидалось

  • 0
    Извините за поздний ответ. Я пока не пробую предложенное вами решение. Но я начинаю верить, что это связано с версией (может ли это быть?). Потому что я помню, что в прошлый раз у меня была такая же проблема на том же сервере. Моя версия PHP 5.3.10, и я использую PDO для подключения к базе данных Sybase.
  • 0
    Да, может быть проблема с версией и / или проблема с драйвером. По умолчанию я использую игрушечный сервер mysql для демонстраций и без особых усилий могу переключиться на oci или sqlserver ... но sybase? Какой драйвер pdo вы используете? DBLIB, ODBC, ...?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню