/** * Executes a SQL statement * * @param mixed $po_caller object representation of the calling class, usually Db() * @param DbStatement $opo_statement * @param string $ps_sql SQL statement * @param array $pa_values array of placeholder replacements */ public function execute($po_caller, $opo_statement, $ps_sql, $pa_values) { if (!$ps_sql) { $opo_statement->postError(240, _t("Query is empty"), "Db->mysql->execute()"); return false; } $vs_sql = $ps_sql; $va_placeholder_map = $opo_statement->getOption('placeholder_map'); $vn_needed_values = sizeof($va_placeholder_map); if ($vn_needed_values != sizeof($pa_values)) { $opo_statement->postError(285, _t("Number of values passed (%1) does not equal number of values required (%2)", sizeof($pa_values), $vn_needed_values), "Db->mysql->execute()"); return false; } for ($vn_i = sizeof($pa_values) - 1; $vn_i >= 0; $vn_i--) { if (is_array($pa_values[$vn_i])) { foreach ($pa_values[$vn_i] as $vn_x => $vs_vx) { $pa_values[$vn_i][$vn_x] = $this->autoQuote($vs_vx); } $vs_sql = substr_replace($vs_sql, join(',', $pa_values[$vn_i]), $va_placeholder_map[$vn_i], 1); } else { $vs_sql = substr_replace($vs_sql, $this->autoQuote($pa_values[$vn_i]), $va_placeholder_map[$vn_i], 1); } } $va_limit_info = $opo_statement->getLimit(); if ($va_limit_info["limit"] > 0 || $va_limit_info["offset"] > 0) { if (!preg_match("/LIMIT[ ]+[\\d]+[,]{0,1}[\\d]*\$/i", $vs_sql)) { // check for LIMIT clause is raw SQL $vn_limit = $va_limit_info["limit"]; if ($vn_limit == 0) { $vn_limit = 4000000000.0; } $vs_sql .= " LIMIT " . intval($va_limit_info["offset"]) . "," . intval($vn_limit); } } if (Db::$monitor) { $t = new Timer(); } if (!($r_res = mysql_query($vs_sql, $this->opr_db))) { $vn_mysql_err = (int) mysql_errno($this->opr_db); switch ($vn_mysql_err) { case 1205: // deadlock // deadlock case 1216: // deadlock $vn_tries = 0; // wait a bit and try the query again (up to 10 times) while ($vn_tries < 10) { usleep(500); if ($r_res = mysql_query($vs_sql, $this->opr_db)) { break; } $vn_tries++; } if (!$r_res) { $opo_statement->postError($this->nativeToDbError($vn_mysql_err), mysql_error($this->opr_db) . (__CA_ENABLE_DEBUG_OUTPUT__ ? "\n<pre>" . caPrintStacktrace() . "</pre>" : ""), "Db->mysql->execute()"); return false; } return new DbResult($this, $r_res); break; case 2006: // gone away // reconnect if ($this->connect()) { if ($r_res = mysql_query($vs_sql, $this->opr_db)) { return new DbResult($this, $r_res); } } $opo_statement->postError($this->nativeToDbError($vn_mysql_err), mysql_error($this->opr_db) . (__CA_ENABLE_DEBUG_OUTPUT__ ? "\n<pre>" . caPrintStacktrace() . "</pre>" : ""), "Db->mysql->execute()"); break; default: $opo_statement->postError($this->nativeToDbError($vn_mysql_err), mysql_error($this->opr_db) . (__CA_ENABLE_DEBUG_OUTPUT__ ? "\n<pre>" . caPrintStacktrace() . "</pre>" : ""), "Db->mysql->execute()"); break; } return false; } if (Db::$monitor) { Db::$monitor->logQuery($ps_sql, $pa_values, $t->getTime(4), is_bool($r_res) ? null : mysql_num_rows($r_res)); } return new DbResult($this, $r_res); }
/** * Executes a SQL statement * * @param mixed $po_caller object representation of the calling class, usually Db() * @param DbStatement $opo_statement * @param string $ps_sql SQL statement * @param array $pa_values array of placeholder replacements */ public function execute($po_caller, $opo_statement, $ps_sql, $pa_values) { if (!$ps_sql) { $opo_statement->postError(240, _t("Query is empty"), "Db->pdo_mysql->execute()"); return false; } $va_placeholder_map = $po_caller->getOption('placeholder_map'); $vs_sql = $ps_sql; $va_proc_values = array(); $va_values_rev = array_reverse(array_keys($pa_values)); foreach ($va_values_rev as $vn_i) { if (is_array($pa_values[$vn_i])) { foreach ($pa_values[$vn_i] as $vn_x => $vs_vx) { $pa_values[$vn_i][$vn_x] = $this->autoQuote($vs_vx); } $vs_str = join(",", $pa_values[$vn_i]); $vs_sql = substr_replace($vs_sql, $vs_str, $va_placeholder_map[$vn_i], 1); continue; } $va_proc_values[] = $pa_values[$vn_i]; } if (sizeof($va_proc_values) != sizeof($pa_values)) { $pa_values = array_reverse($va_proc_values); $vo_dbstatement = $this->prepare($po_caller, $vs_sql); $opo_statement = $vo_dbstatement->getOption('native_statement'); } if (Db::$monitor) { $t = new Timer(); } if (!$opo_statement->execute(is_array($pa_values) && sizeof($pa_values) ? array_values($pa_values) : null)) { $va_err = $this->opr_db->errorCode(); $po_caller->postError($this->nativeToDbError($this->opr_db->errorCode()), $va_err[2] . (__CA_ENABLE_DEBUG_OUTPUT__ ? "\n<pre>" . caPrintStacktrace() . "</pre>" : ""), "Db->pdo_mysql->execute()"); return false; } if (Db::$monitor) { Db::$monitor->logQuery($vs_sql, $pa_values, $t->getTime(4), $opo_statement->rowCount()); } return new DbResult($this, $opo_statement); }
/** * Prepare a statement and return a PDOStatement-like object. * * @param string|\Zend\DB\Select $sql SQL query * @return Zend_Db_Statment|PDOStatement */ public function prepare($sql) { $queryId = $this->getProfiler()->queryStart($sql); if(count($this->_statementStack)) { $stmt = array_pop($this->_statementStack); } else { $stmt = new DbStatement(); } if($this->getProfiler()->getEnabled() == true) { $qp = $this->getProfiler()->getQueryProfile($queryId); $stmt->setQueryProfile($qp); } return $stmt; }
/** * Executes a SQL statement * * @param mixed $po_caller object representation of the calling class, usually Db() * @param DbStatement $opo_statement * @param string $ps_sql SQL statement * @param array $pa_values array of placeholder replacements */ public function execute($po_caller, $opo_statement, $ps_sql, $pa_values) { if (!$ps_sql) { $opo_statement->postError(240, _t("Query is empty"), "Db->mysqli->execute()"); return false; } $vs_sql = $ps_sql; $va_placeholder_map = $opo_statement->getOption('placeholder_map'); $vn_needed_values = sizeof($va_placeholder_map); if ($vn_needed_values != sizeof($pa_values)) { $opo_statement->postError(285, _t("Number of values passed (%1) does not equal number of values required (%2)", sizeof($pa_values), $vn_needed_values), "Db->mysqli->execute()"); return false; } for ($vn_i = sizeof($pa_values) - 1; $vn_i >= 0; $vn_i--) { if (is_array($pa_values[$vn_i])) { foreach ($pa_values[$vn_i] as $vn_x => $vs_vx) { $pa_values[$vn_i][$vn_x] = $this->autoQuote($vs_vx); } $vs_sql = substr_replace($vs_sql, join(',', $pa_values[$vn_i]), $va_placeholder_map[$vn_i], 1); } else { $vs_sql = substr_replace($vs_sql, $this->autoQuote($pa_values[$vn_i]), $va_placeholder_map[$vn_i], 1); } } $va_limit_info = $opo_statement->getLimit(); if ($va_limit_info["limit"] > 0 || $va_limit_info["offset"] > 0) { if (!preg_match("/LIMIT[ ]+[\\d]+[,]{0,1}[\\d]*\$/i", $vs_sql)) { // check for LIMIT clause is raw SQL $vn_limit = $va_limit_info["limit"]; if ($vn_limit == 0) { $vn_limit = 4000000000; } $vs_sql .= " LIMIT " . intval($va_limit_info["offset"]) . "," . intval($vn_limit); } } if (Db::$monitor) { $t = new Timer(); } if (!($r_res = mysqli_query($this->opr_db, $vs_sql))) { //print "<pre>".caPrintStacktrace()."</pre>\n"; $opo_statement->postError($this->nativeToDbError(mysqli_errno($this->opr_db)), mysqli_error($this->opr_db), "Db->mysqli->execute()"); return false; } if (Db::$monitor) { Db::$monitor->logQuery($ps_sql, $pa_values, $t->getTime(4), is_bool($r_res) ? null : mysqli_num_rows($r_res)); } return new DbResult($this, $r_res); }