2016-03-27 3 views
0

Ich habe eine SQL $ Abfrage wie folgt;Warum kann ich Zeilen mit PDO nicht mit Prepare-Funktion aktualisieren?

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 

Und meine Werte $ Array;

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 
) 

Ich versuche, eine Zeile mit PDO Prepare-Funktion zu aktualisieren;

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

Und ich bekomme keine Fehler, aber Zeilen sind nicht betroffen, nachdem die Abfrage ausführen. Wo ist mein Fehler?

mysql tags table

edit: Ich Werte Array wie folgt zu schaffen;

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

$values = array(); 

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

Und das ist, wie ich die Abfrage erstellen;

$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

Ihr Array sieht seltsam aus. Können Sie Ihren PHP-Code dort zeigen, wo Sie dieses Array erstellt haben? –

+0

Es scheint, dass Sie phpMyAdmin verwenden. Haben Sie (in phpMyAdmin) bestätigt, dass die Zeilen tatsächlich nicht betroffen sind? Dadurch können Sie feststellen, ob das Problem mit Ihrer Abfrage oder mit 'rowCount()' zusammenhängt. – alexw

+2

Wenn Sie auf die gleichen Daten aktualisieren, dann gibt es keine Aktualisierung heppens und somit Zeilenanzahl ist 0. –

Antwort

2

Sie entgehen den Spaltennamen falsch. Zum Beispiel schließen die zurück Zecken sollten nicht die ganze tags.name, sondern die Tabellen- und Spaltennamen getrennt:

`tags`.`name` 

die Ausgabe von PDO::errorInfo() Überprüfung bestätigt dies (emulierten bereitet sich auf false um eingestellt sein, dies zu sehen , jedoch).

Allgemeine Hinweise:

  • Sie brauchen nicht den Doppelpunkt-Präfix für die Schlüssel des Arrays angeben (ebenfalls, wenn dies ausdrücklich Spalten über bindParam() oder bindValue() Bindung) gebunden zu sein.
  • Sie sollten vermeiden, Back-Ticks in Ihren PDO-Abfragen zu verwenden. Sie sind eine MySQL-spezifische Funktion und PDO ist keine SQL-Abstraktionsschicht (wodurch einer der Hauptvorteile von PDO - Portabilität - verhindert wird).
+0

Vielen Dank. :) Aber wenn ich die emulierten bereitet auf false einstellen, kann ich nicht SetFetchMode-Funktion für FETCH_CLASS warum kann ich nicht? –

+0

Dies ist keine Einschränkung, die mir bekannt ist. Ich schlage vor, Sie öffnen eine weitere Frage, die Ihr neues Problem mit Beispielcode umreißt, da der Kommentarabschnitt kein praktischer Ort ist, um das zu lösen. – tpunt

Verwandte Themen