टुकड़ा पिकेट से जुड़े हुए के बाद, मैं करने के लिए कुछ सुधार किए हैं।
2) अब आप एक सहयोगी सरणी (कुंजी => मान) या सहयोगी सरणी की एक सरणी पास कर सकते हैं। दूसरे रूप में, यह एक बहु अद्यतन करता है।
मैंने केवल इसे mysqli के साथ परीक्षण किया, और यह अच्छी तरह से काम करता है।
कोड का यह टुकड़ा सिस्टम/डेटाबेस/ड्राइवर/mysqli/mysqli_driver में जाता है।php
function _duplicate_insert($table, $values)
{
$updatestr = array();
$keystr = array();
$valstr = array();
foreach($values as $key => $val)
{
$updatestr[] = $key." = ".$val;
$keystr[] = $key;
$valstr[] = $val;
}
$sql = "INSERT INTO ".$table." (".implode(', ',$keystr).") ";
$sql .= "VALUES (".implode(', ',$valstr).") ";
$sql .= "ON DUPLICATE KEY UPDATE ".implode(', ',$updatestr);
return $sql;
}
function _multi_duplicate_insert($table, $values)
{
$updatestr = array();
$keystr = array();
$valstr = null;
$entries = array();
$temp = array_keys($values);
$first = $values[$temp[0]];
foreach($first as $key => $val)
{
$updatestr[] = $key." = VALUES(".$key.")";
$keystr[] = $key;
}
foreach($values as $entry)
{
$valstr = array();
foreach($entry as $key => $val)
{
$valstr[] = $val;
}
$entries[] = '('.implode(', ', $valstr).')';
}
$sql = "INSERT INTO ".$table." (".implode(', ',$keystr).") ";
$sql .= "VALUES ".implode(', ',$entries);
$sql .= "ON DUPLICATE KEY UPDATE ".implode(', ',$updatestr);
return $sql;
}
और यह /system/database/DB_query_builder.php फ़ाइल में चला जाता है:
function on_duplicate($table = '', $set = NULL)
{
if (! is_null($set))
{
$this->set($set);
}
if (count($this->qb_set) == 0)
{
if ($this->db_debug)
{
return $this->display_error('db_must_use_set');
}
return FALSE;
}
if ($table == '')
{
if (! isset($this->qb_from[0]))
{
if ($this->db_debug)
{
return $this->display_error('db_must_set_table');
}
return FALSE;
}
$table = $this->qb_from[0];
}
$is_multi = false;
foreach (array_keys($set) as $k => $v) {
if ($k === $v) {
$is_multi = true; //is not assoc
break;
}
}
if($is_multi)
{
$sql = $this->_multi_duplicate_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_set);
}
else
{
$sql = $this->_duplicate_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_set);
}
$this->_reset_write();
return $this->query($sql);
}
तो फिर तुम एक ही पंक्ति सम्मिलित/अपडेट करने के लिए ऐसा कर सकते हैं:
$this->db->on_duplicate('table', array('column1' => 'value', 'column2' => 'value'));
या यह एक बहु डालने/अद्यतन के लिए:
$this->db->on_duplicate('table', array(
array('column1' => 'value', 'column2' => 'value'),
array('column1' => 'value', 'column2' => 'value')
));
हाँ यह मदद मिली :) – Nishant
यह सबसे साफ समाधान है जब तक सीआई इसे जोड़ता नहीं है। ओ/ – Nemke
वोट दें जो संदिग्ध है क्योंकि वे समर्थन छोड़ते हैं :(http://ellislab.com/blog/entry/ellislab-seeking-new-owner-for-codeigniter – Shaffe