0

PDO で PHP オブジェクト指向を使用するアプリケーションに取り組んでいます。クエリの実行が失敗した理由の問題を見つけるのに何時間も苦労しました。配列にバインドする文字列形式のパラメーターとして値を指定したことがわかりました。すべてのパラメーターをクエリの疑問符プレースホルダーにバインドする一般的なループがあります。もちろん、パラメーターはすべて文字列形式であると見なされます。ただし、整数形式の列があります。(int)orを使用して変数を整数にキャストしても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++;
    }
}

どうすればいいですか?この問題を解決するためにコードを変更するにはどうすればよいですか? コードのどの部分を変更する必要があるかどうかはわかりませんが、これの回避策を考えるのは困惑しています。前もって感謝します。

編集: PHP バージョン 5.3.10、PDO は Sybase に接続します

4

2 に答える 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++;
    }
}

誰かがこの種の問題を抱えている場合、これが誰かの助けになることを願っています。これについて私を助けてくれた人々に感謝します。

于 2015-02-04T02:44:34.793 に答える
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

予想通り

于 2015-02-02T08:48:55.770 に答える