2009-03-29 10 views
1

Ich versuche, eine flexible Update-Abfrage zu erstellen. Ich habe jetzt so etwas wie dieses:Erstellen einer flexiblen Update-Abfrage

  $lsQuery = "UPDATE `"; 
     $lsQuery .= $psTableName; 
     $lsQuery .= " SET "; 
     foreach($psValues as $lsKey => $lsValue) 
     { 
      $lsQuery .= $lsKey; 
      $lsQuery .= " = '"; 
      $lsQuery .= $lsValue; 
      $lsQuery .= "' AND "; 
     } 
     $lsQuery .= "` "; 
     $lsQuery .= "WHERE "; 
     if(isset($psWhere)){ 
      foreach($psWhere as $lsKey => $lsValue) 
      { 
       $lsQuery .= $lsKey; 
       $lsQuery .= " = '"; 
       $lsQuery .= $lsValue; 
       $lsQuery .= "' AND "; 
      } 
     } 
     $lsQuery = substr($lsQuery,0,(strlen($lsQuery)-5)); 

Aber wenn ich meine Abfrage auf dem Bildschirm drucken bekomme ich so etwas wie:

UPDATE persons SET per_password = '2a6445462a09d0743d945ef270b9485b' AND WHERE per_email = '[email protected]'

Wie kann Ich werde dieses zusätzliche 'UND' los?

Antwort

2

Wenn Sie Ihren vorhandenen Code behalten möchten.

$lsWhere = array(); 
foreach($psWhere as $lsKey => $lsValue) 
{ 
    $lsWhere[] = $lsKey." = '".mysql_real_escape_string($lsValue)."'"; 
} 
$lsQuery .= join(" AND ", $lsWhere); 
+0

tnx. Ich suchte nach einer Lösung, für die ich meine gesamte Update-Funktion nicht ändern müsste. – sanders

3

würde ich wahrscheinlich beginnen mit:

function update($table, $set, $where) { 
    $change = array(); 
    foreach ($set as $k => $v) { 
    $change[] = $k . ' = ' . escape($v); 
    } 
    $conditions = array(); 
    foreach ($where as $k => $v) { 
    $conditions[] = $k . ' = ' . escape($v); 
    } 
    $query = 'UPDATE ' . $table . ' SET ' . 
    implode(', ', $change) . ' WHERE ' . 
    implode(' AND ', $conditions); 
    mysql_query($query); 
    if (mysql_error()) { 
    // deal with it how you wish 
    } 
} 

function escape($v) { 
    if (is_int($v)) { 
    $v = intval($v); 
    } else if (is_numeric($v)) { 
    $v = floatval($v); 
    } else if (is_null($v) || strtolower($v) == 'null') { 
    $v = 'null'; 
    } else { 
    $v = "'" . mysql_real_escape_string($v) . "'"; 
    } 
    return $v; 
} 
+0

Ich benutze etwas ähnliches, wenn ich nicht auf Dinge wie das Zend Framework zugreifen kann, und es funktioniert gut. –

0

Es ist keine Lösung, die ich bin besonders stolz, aber man kann immer $lsQuery .= 'someField=someField' hinzufügen.

+0

Sorry, aber ich verstehe nicht, was du meinst. – sanders

+0

@tstenner: Ich denke du hast die Frage falsch verstanden. @sanders fragt, wie man das UND in der SET-Klausel und nicht in der WHERE-Klausel loswerden kann. –

+0

In meiner Antwort wäre die resultierende Abfrage "[..] SET per_password = 'something' UND someField = someField WHERE field1 = 1 [..]", also wäre die WHERE-Klausel nicht betroffen. – tstenner

Verwandte Themen