2016-05-13 13 views
-4

Grüße da draußen auf dem outerweb ;-)PHP mysqli Einsatz auf doppelte

Der Versuch, mein Leben ein wenig leichter zu machen, entschied ich mich für die Aktualisierung meine Tabellen mit Daten, die eine Funktion zu tun.

Ich möchte es zB gemacht haben. wie folgt aus:

$table = "ticket_stati"; 
$fields = array(`ticket_stati_id`, `locked_record`, `ticket_stati_name`, `ticket_stati_description`, `ticket_stati_color`); 

$data = array(1, 1, 'Open', 'The ticket is marked as open and not assigned or acked.', '#130a5a'); 
// Call function 
func_update_table($table, $fields, $data); 

$data = array(2, 1, 'Assigned', 'The ticket has been assigned to a user or group', '#11a916'); 
func_update_table($table, $fields, $data); 

Aber Ich habe Probleme, herauszufinden, wie die INSERT INTO sollte, dass aktualisiert nur die Felder mit aktualisierbaren Daten auf Duplikat, um sicherzustellen, erstellt werden.

Ich nehme an, dass ON DUPLICATE PRIMARY Schlüssel für die Entscheidung verwendet, wenn Duplikat existiert. Also sollte alles andere als der Primärschlüssel aktualisiert werden (Im obigen Beispiel, entfernen ticket_static_id und die entsprechende ID in Daten und den Rest aktualisieren) Oder nur Daten in $ Daten mit Daten in der Tabelle übereinstimmen - und die Felder mit unterschiedlichen Daten - aktualisieren diese .

+0

Was sind aktualisierbare Daten? – Borna

+0

Er ;-) Nur daran gedacht musste ich das erklären;) Irgendwelche Möglichkeiten. Ich nehme an, dass ON DUBLICATE PRIMARY-Schlüssel für die Entscheidung verwendet, wenn duplicate existiert. Also sollte alles andere als der Primärschlüssel aktualisiert werden (Im obigen Beispiel, entfernen Sie ticket_stati_id und die entsprechende ID in den Daten und aktualisieren Sie den Rest) Oder nur Daten in $ Daten mit Daten in der Tabelle - und die Felder mit unterschiedlichen Daten - aktualisieren jene. – osomanden

+0

@osomanden Ich habe deinen Kommentar in deine Frage verschoben. – ib11

Antwort

-1

schien, dass ich etwas arbeiten musste. (Arg ..)

Also machte ich eine kleine Funktion (basierend auf oben Asumption ON dublicate auf Primärschlüssel in Bezug auf

Funktion alter_data_in_table ($ table, $ Felder, $ data) { GLOBAL $ db;.

/* 
expect Index to be primary or unique 
so if primary key exists - update else insert 
*/ 
$temp_line = array(); 
$temp_data = array(); 

/* Secure sanity in data */ 
foreach ($data as $line) { 
    $temp_line = array(); 
    foreach ($line as $value) { 
     $value = str_ireplace("'", "", $value); 
     $temp_line[] = "'".$value."'"; 
    } 
    $temp_data[] = $temp_line; 
} 
$data = $temp_data; 

foreach ($data AS $line) { 
    $sql = " 
    INSERT INTO ".$table." (".implode(", ", $fields).") VALUES (".implode(", ", $line).") 
    ON DUPLICATE KEY UPDATE "; 
    // Start at 1. Skip ID 
    for($x=1; $x < sizeof($fields); $x++) { 
     $line[$x] = str_ireplace("'", "", $line[$x]); 
     $sql .= $fields[$x]."='".$line[$x]."'"; 
     if ($x+1 == sizeof($fields)) 
      $sql .= ";"; 
     else 
      $sql .= ", "; 
    } 
    mysqli_query($db, $sql) or cc("ERROR: SQL Update Table Data", $sql, mysqli_error($db), 0, $this_document); 
} 

} // end function alter_data_in_table

Verwendung wäre:

$table = "ticket_stati"; 
$fields = array('ticket_stati_id', 'locked_record', 'ticket_stati_name', 'ticket_stati_description', 'ticket_stati_color'); 

$data = array(
array(1, 1, 'Open', 'The ticket is marked as open and not assigned or acked.', '#130a5a'), 
array(2, 1, 'Assigned', 'The ticket has been assigned to a user or group', '#11a916'), 
array(3, 1, 'Closed', 'The ticket has been closed and are no longer active.', '#1121e7'), 
array(4, 1, 'Marked as spam', 'The ticket has been marked as spam and is set for purging', '#ab1d1d'), 
array(5, 1, 'Time Started', 'The time has been started and the ticket is active', '#f28282'), 
array(6, 1, 'Time Stopped', 'The time has been stopped and the ticket is inactive', '#ddf76b'), 
array(7, 1, 'Updated', 'The ticket has been updated', '#42f62d'), 
array(8, 1, 'Manual Escalation', 'The ticket has been escalated by a user and nearest leader has been informed.', '#028d00'), 
array(9, 1, 'Automatic Escalation', 'The ticket has been automatic escalated and nearest leader has been informed.', '#9a1212'), 
array(10, 1, 'Pending Customer', 'The ticket awaits responce from customer', '#44a981'), 
array(11, 1, 'Pending Supplier', 'The ticket awaits responce from supplier', '#315e4c'), 
array(12, 1, 'Pending User', 'The ticket awaits responce from another user.', '#7ba75c'), 
array(13, 1, 'Pending External Consultant', 'The ticket awaits responce from external Consultant', '#6a1792'), 
array(14, 1, 'ToDo', 'Ticket marked to be dealt with later', '#804000') 
); 
alter_data_in_table($table, $fields, $data); 

Aus zum Test Bett ;-)