diff --git a/e107_handlers/db_debug_class.php b/e107_handlers/db_debug_class.php
index a61f92490..1a567cdd7 100644
--- a/e107_handlers/db_debug_class.php
+++ b/e107_handlers/db_debug_class.php
@@ -167,7 +167,7 @@ class e107_db_debug {
$t['marker'] = $this->curTimeMark;
$t['caller'] = "$sCallingFile($sCallingLine)";
$t['query'] = $query;
- $t['ok'] = $sQryRes ? TRUE : FALSE;
+ $t['ok'] = ($sQryRes !==false) ? true : false;
$t['error'] = $sQryRes ? '' : $sql->getLastErrorText(); // mysql_error();
$t['nFields'] = $nFields;
$t['time'] = $mytime;
diff --git a/e107_handlers/mysql_class.php b/e107_handlers/mysql_class.php
index db9033234..58d60d922 100644
--- a/e107_handlers/mysql_class.php
+++ b/e107_handlers/mysql_class.php
@@ -99,6 +99,7 @@ class e_db_mysql
public $total_results = false; // Total number of results
private $pdo = false; // using PDO or not.
+ private $pdoBind= false;
/**
@@ -189,7 +190,7 @@ class e_db_mysql
{
try
{
- $this->mySQLaccess = new PDO("mysql:host=".$this->mySQLserver."; port=".$this->mySQLport, $this->mySQLuser, $this->mySQLpassword, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_FOUND_ROWS => true));
+ $this->mySQLaccess = new PDO("mysql:host=".$this->mySQLserver."; port=".$this->mySQLport, $this->mySQLuser, $this->mySQLpassword, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(PDOException $ex)
@@ -283,7 +284,7 @@ class e_db_mysql
{
try
{
- $this->mySQLaccess = new PDO("mysql:host=".$this->mySQLserver."; port=".$this->mySQLport, $this->mySQLuser, $this->mySQLpassword, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_FOUND_ROWS => true));
+ $this->mySQLaccess = new PDO("mysql:host=".$this->mySQLserver."; port=".$this->mySQLport, $this->mySQLuser, $this->mySQLpassword, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(PDOException $ex)
{
@@ -506,6 +507,8 @@ class e_db_mysql
else
{
$sQryRes = is_null($rli) ? @mysql_query($query,$this->mySQLaccess) : @mysql_query($query, $rli);
+ $this->mySQLlastErrNum = mysql_errno();
+ $this->mySQLlastErrText = mysql_error();
}
$e = microtime();
@@ -557,25 +560,21 @@ class e_db_mysql
{
$buglink = is_null($rli) ? $this->mySQLaccess : $rli;
- if($this->pdo == true && isset($ex) && is_object($ex))
+ if($this->pdo == true)
{
if(is_array($query))
{
- $query = "ERROR: ".$ex->errorInfo[2]."
PREPARE: ".$query['PREPARE']."
BIND:".print_a($query['BIND'],true); // ,true);
-
+ $query = "PREPARE: ".$query['PREPARE']."
BIND:".print_a($query['BIND'],true); // ,true);
}
- else
+
+ if(isset($ex) && is_object($ex))
{
$query = $ex->getMessage();
- $query .= print_a( $ex->getTrace(),true);
-
-
-
-
+ $query .= print_a($ex->getTrace(),true);
}
}
-
+ // $query = var_export($query,true);
$db_debug->Mark_Query($query, $buglink, $sQryRes, $aTrace, $mytime, $pTable);
}
else
@@ -836,6 +835,16 @@ class e_db_mysql
$REPLACE = FALSE;
}
+ if(isset($arg['_DUPLICATE_KEY_UPDATE']))
+ {
+ $DUPEKEY_UPDATE = true;
+ unset($arg['_DUPLICATE_KEY_UPDATE']);
+ }
+ else
+ {
+ $DUPEKEY_UPDATE = false;
+ }
+
if(!isset($arg['_FIELD_TYPES']) && !isset($arg['data']))
{
//Convert data if not using 'new' format
@@ -884,10 +893,18 @@ class e_db_mysql
unset($tmp);
+
+
if($REPLACE === false)
{
$query = "INSERT INTO `".$this->mySQLPrefix."{$table}` ({$keyList}) VALUES ({$valList})";
+ if($DUPEKEY_UPDATE === true)
+ {
+ $query .= " ON DUPLICATE KEY UPDATE ";
+ $query .= $this->_prepareUpdateArg($tableName, $arg);
+ }
+
}
else
{
@@ -946,7 +963,7 @@ class e_db_mysql
public function lastInsertId()
{
- $tmp = ($this->pdo) ? $this->mySQLaccess->lastInsertId() : mysql_insert_id($this->mySQLaccess);
+ $tmp = ($this->pdo) ? (int) $this->mySQLaccess->lastInsertId() : mysql_insert_id($this->mySQLaccess);
return ($tmp) ? $tmp : true; // return true even if table doesn't have auto-increment.
}
@@ -1020,6 +1037,65 @@ class e_db_mysql
}
+ private function _prepareUpdateArg($tableName, $arg)
+ {
+ if (is_array($arg)) // Remove the need for a separate db_UpdateArray() function.
+ {
+
+ if(!isset($arg['_FIELD_TYPES']) && !isset($arg['data']))
+ {
+ //Convert data if not using 'new' format
+ $_tmp = array();
+ if(isset($arg['WHERE']))
+ {
+ $_tmp['WHERE'] = $arg['WHERE'];
+ unset($arg['WHERE']);
+ }
+ $_tmp['data'] = $arg;
+ $arg = $_tmp;
+ unset($_tmp);
+ }
+
+ if(!isset($arg['data'])) { return false; }
+
+ // See if we need to auto-add field types array
+ if(!isset($arg['_FIELD_TYPES']) && ALLOW_AUTO_FIELD_DEFS)
+ {
+ $arg = array_merge($arg, $this->getFieldDefs($tableName));
+ }
+
+ $fieldTypes = $this->_getTypes($arg);
+
+
+ $new_data = '';
+ $this->pdoBind = array();
+ foreach ($arg['data'] as $fn => $fv)
+ {
+ $new_data .= ($new_data ? ', ' : '');
+ $ftype = isset($fieldTypes[$fn]) ? $fieldTypes[$fn] : 'str';
+
+ $new_data .= ($this->pdo == true && $ftype !='cmd') ? "`{$fn}`= :". $fn : "`{$fn}`=".$this->_getFieldValue($fn, $fv, $fieldTypes);
+
+ if($fv == '_NULL_')
+ {
+ $ftype = 'null';
+ }
+
+ if($ftype != 'cmd')
+ {
+ $this->pdoBind[$fn] = array('value'=>$this->_getPDOValue($ftype,$fv), 'type'=> $this->_getPDOType($ftype));
+ }
+ }
+
+ $arg = $new_data .(isset($arg['WHERE']) ? ' WHERE '. $arg['WHERE'] : '');
+
+ }
+
+ return $arg;
+
+ }
+
+
/**
* @return int number of affected rows, or false on error
* @param string $tableName - Name of table to access, without any language or general DB prefix
@@ -1049,75 +1125,28 @@ class e_db_mysql
$this->mySQLaccess = $db_ConnectionID;
}
- if (is_array($arg)) // Remove the need for a separate db_UpdateArray() function.
- {
-
- if(!isset($arg['_FIELD_TYPES']) && !isset($arg['data']))
- {
- //Convert data if not using 'new' format
- $_tmp = array();
- if(isset($arg['WHERE']))
- {
- $_tmp['WHERE'] = $arg['WHERE'];
- unset($arg['WHERE']);
- }
- $_tmp['data'] = $arg;
- $arg = $_tmp;
- unset($_tmp);
- }
- if(!isset($arg['data'])) { return false; }
-
- // See if we need to auto-add field types array
- if(!isset($arg['_FIELD_TYPES']) && ALLOW_AUTO_FIELD_DEFS)
- {
- $arg = array_merge($arg, $this->getFieldDefs($tableName));
- }
-
- $fieldTypes = $this->_getTypes($arg);
-
-
- $new_data = '';
- $bind = array();
- foreach ($arg['data'] as $fn => $fv)
- {
- $new_data .= ($new_data ? ', ' : '');
- $ftype = isset($fieldTypes[$fn]) ? $fieldTypes[$fn] : 'str';
-
- $new_data .= ($this->pdo == true && $ftype !='cmd') ? "`{$fn}`= :". $fn : "`{$fn}`=".$this->_getFieldValue($fn, $fv, $fieldTypes);
-
- if($fv == '_NULL_')
- {
- $ftype = 'null';
- }
-
- if($ftype != 'cmd')
- {
- $bind[$fn] = array('value'=>$this->_getPDOValue($ftype,$fv), 'type'=> $this->_getPDOType($ftype));
- }
- }
-
- $arg = $new_data .(isset($arg['WHERE']) ? ' WHERE '. $arg['WHERE'] : '');
-
- }
+ $arg = $this->_prepareUpdateArg($tableName, $arg);
$query = 'UPDATE '.$this->mySQLPrefix.$table.' SET '.$arg;
- if($this->pdo == true && !empty($bind))
+ if($this->pdo == true && !empty($this->pdoBind))
{
$query = array(
'PREPARE' => $query,
- 'BIND' => $bind,
+ 'BIND' => $this->pdoBind,
);
}
+ $result = $this->mySQLresult = $this->db_Query($query, NULL, 'db_Update', $debug, $log_type, $log_remark);
- if ($result = $this->mySQLresult = $this->db_Query($query, NULL, 'db_Update', $debug, $log_type, $log_remark))
+ if ($result !==false)
{
+
if($this->pdo == true)
{
if(is_object($result))
{
- $result = $this->rowCount();
+ // $result = $this->rowCount();
}
}
else