-1

更新スクリプトに問題があります。値をバインドしましたが、falseが返され、何が間違っているのかわかりません。

私はこれを実行しています:

$row = $db->query('
            UPDATE '. $config->db_prefix .'_adverts
            SET ad_type = ?, 
            title = ?, 
            text = ?, 
            price = ?, 
            category = ?, 
            condition = ?
            WHERE aid = ?')
                ->bind(1, $ad_type)
                ->bind(2, $title)
                ->bind(3, $text)
                ->bind(4, $price)
                ->bind(5, $category)
                ->bind(6, $condition)
                ->bind(7, $aid)->execute();
        }

バインド関数は次のとおりです。

public function bind($pos, $value, $type = null) {

        if( is_null($type) ) {

            switch( true ) {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }

        $this->stmt->bindValue($pos, $value, $type);
        return $this;
    }

avar_dump($this)は私に与えます:

object(DB)#1 (2) { ["dbh":protected]=> object(PDO)#2 (0) { } ["stmt":protected]=> object(PDOStatement)#15 (1) { ["queryString"]=> string(211) " UPDATE rno_adverts SET ad_type = ?, title = ?, text = ?, price = ?, category = ?, condition = ? WHERE aid = ?" } }

でも何が悪いのかわかりません。

編集:

クエリ関数は次のとおりです。

public function query($query) {
        $this->stmt = $this->dbh->prepare($query);
        return $this;
    }

そして実行はこれです:

public function execute($var = null) {
        return $this->stmt->execute($var);
    }

エラー:

Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'condition = 3 WHERE aid = 1'

クエリの出力:

UPDATE rno_adverts SET ad_type = 3, title = "Gul bil", text = "En flot gul bil med hvide striber", price = 500, category = 4, condition = 3 WHERE aid = 1

私はこのクエリを知らなくなったので、問題が何であるかわかりません。カテゴリと条件を削除すると、問題なく動作します。データベースでは、両方のフィールドがINTNOTNULLです。

4

3 に答える 3

2

バインド関数は、プリペアドステートメントでのみ使用できます。->query()クエリのすべての値/変数を事前に知っているクエリを生成するためのものです。

于 2013-03-06T08:14:16.163 に答える
0

このバインド機能を取り除くだけで大丈夫です

$sql = 'UPDATE '. $config->db_prefix .'_adverts SET 
        ad_type = ?, title = ?, text = ?, price = ?, category = ?, condition = ?
        WHERE aid = ?';
$db->query($sql);
$db->execute(array($ad_type, $title, $text, $price, $category, $condition, $aid));
于 2013-03-06T11:55:19.477 に答える
-1

あなたの質問から、エラーがどこにあるのか具体的に言うことはできません。したがって、最初にエラーチェックを追加することをお勧めします。たとえばbindvalue()、を使用して、戻り値をチェックしないでください。

$this->stmt->bindValue($pos, $value, $type);

これが失敗した場合は、代わりに例外をスローします。

$bind = $this->stmt->bindValue($pos, $value, $type);
if (!$bind) {
    throw new Exception(sprintf("Unable to bind parameter %s with a value of type #%d", $pos, $type));
}

これにより、値のバインドで問題が発生するのを防ぐことができますが、気付かれることはありません。

実行と同様です。失敗する理由を提供する場合は、エラー情報を読み取って例外をスローする必要があります。

于 2013-03-06T08:35:10.050 に答える