2016-03-27 13 views
0

私はこのようにSQL $クエリを持っています。準備機能を使用してPDOで行を更新できないのはなぜですか?

UPDATE `tags` SET `tags.name` = :name, 
        `tags.slug` = :slug, 
        `tags.date_published` = :date_published, 
        `tags.meta_title` = :meta_title, 
        `tags.meta_description` = :meta_description, 
        `tags.meta_keywords` = :meta_keywords 
WHERE `tags.id` = :id 

そして、私の$値配列。

Array 
(
    [:name] => iphone 
    [:slug] => iphone 
    [:date_published] => 2016-03-27 
    [:meta_title] => iphone Yazıları 
    [:meta_description] => iphone hakkında son gelişmeler ve faydalı bilgiler. 
    [:meta_keywords] => iphone yazıları, iphone hakkında bilgiler, iphone haberleri 
    [:id] => 24 
) 

PDOの準備関数を使用して1つの行を更新しようとしています。

$sth = $this->db->prepare($query); 
$sth->execute($values); 
echo "affected rows: ".$sth->rowCount(); // prints 0 
return $sth->rowCount() ? true : false; 

エラーは発生しませんが、クエリの実行後に行は影響を受けません。私のミスはどこですか?

mysql tags table

編集: 私はこのような値の配列を作成しています。

$params = array(
    "id", "name", "slug", "date_published", 
    "meta_title", "meta_description", "meta_keywords"); 

$values = array(); 

foreach ($params as $key) { 
    @$values[$key] = $_POST[$key]; 
} 

これは私がクエリを作成する方法です。

$query = "UPDATE `$table` SET"; 
$values = array(); 

/* Add field names and placeholders to query. */ 
foreach ($params as $key => $value) { 
    $query .= " `{$table}.{$key}` = :" . $key . ","; 
    $values[":" . $key] = $value; 
} 

/* Remove last comma. */ 
$query = substr($query, 0, -1); 

/* Build where condition. */ 
if ($cond) { 
    $query .= " WHERE "; 
    foreach ($cond as $key => $value) { 
     $query .= " `{$table}.{$key}` = :" . $key . ","; 
     $values[":" . $key] = $value; 
    } 
    /* Remove last comma. */ 
    $query = substr($query, 0, -1); 
} 
+0

あなたの配列が奇妙に見えます。この配列を作成する場所にPHPコードを表示できますか? –

+0

phpMyAdminを使用しているようです。行が実際に影響を受けていないことを(phpMyAdminで)確認しましたか?これは、問題がクエリーにあるのか、 'rowCount()'であるのかを判断するのに役立ちます。 – alexw

+2

同じデータに更新している場合は、更新ヘップがないので、行数は0です。 –

答えて

2

誤って列名をエスケープしています。例えば、バックティックはtags.nameの全体を囲むべきではありませんが、個別にではなく、テーブルやカラム名:

`tags`.`name` 

PDO::errorInfo()の出力を確認するには、確認し、この(これを見るためにfalseに設定する必要があります準備をエミュレート、 しかしながら)。

一般的なノートは:(明示的bindParam()またはbindValue()を経由して列をバインドする場合も同様に)

  • あなたは束縛されるものでは配列のキーのためにコロンの接頭辞を指定する必要はありません。
  • PDOクエリでバックティックを使用しないでください。これらはMySQL特有の機能であり、PDOはSQL抽象化レイヤーではないため、PDOの主なメリットの1つを防ぐことができます(移植性)。
+0

ありがとうございました:) エミュレートされた準備をfalseに設定すると、FETCH_CLASSのためにsetFetchMode関数を使用できません。 –

+0

これは私が認識している制限ではありません。コメント欄はこれを解決する実用的な場所ではないので、サンプルコードで新しい問題の概要を説明する別の質問を開くことをお勧めします。 – tpunt

関連する問題