method query documentation in bbn\Db\Languages\Sql
Executes a writing statement and return the number of affected rows or return a query object for the reading * statement
function($statement)
{
if (!$this->pdo) {
return null;
}
$args = \func_get_args();
// If fancy is false we just use the regular PDO query function
if (!$this->_fancy) {
return $this->pdo->query(...$args);
}
// The function can be called directly with func_get_args()
while ((\count($args) === 1) && \is_array($args[0])){
$args = $args[0];
}
if (!empty($args[0]) && \is_string($args[0])) {
// The first argument is the statement
$statement = trim(array_shift($args));
// Sending a hash as second argument from helper functions will bind it to the saved statement
if (count($args)
&& \is_string($args[0])
&& isset($this->queries[$args[0]])
) {
$hash = is_string($this->queries[$args[0]]) ? $this->queries[$args[0]] : $args[0];
$hash_sent = array_shift($args);
}
else {
$hash = $this->makeHash($statement);
}
$driver_options = [];
if (count($args)
&& \is_array($args[0])
) {
// Case where drivers are arguments
if (!array_key_exists(0, $args[0])) {
$driver_options = array_shift($args);
}
// Case where values are in a single argument
elseif (\count($args) === 1) {
$args = $args[0];
}
}
/** @var array $params Will become the property last_params each time a query is executed */
$params = [
'statement' => $statement,
'values' => [],
'last' => microtime(true)
];
$num_values = 0;
foreach ($args as $i => $arg){
if (!\is_array($arg)) {
$params['values'][] = $arg;
$num_values++;
}
elseif (isset($arg[2])) {
$params['values'][] = $arg[2];
$num_values++;
}
}
if (!isset($this->queries[$hash])) {
/** @var int $placeholders The number of placeholders in the statement */
$placeholders = 0;
if ($sequences = $this->parseQuery($statement)) {
/* Or looking for question marks */
$sequences = array_keys($sequences);
preg_match_all('/(\?)/', $statement, $exp);
$placeholders = isset($exp[1]) && \is_array($exp[1]) ? \count($exp[1]) : 0;
while ($sequences[0] === 'OPTIONS'){
array_shift($sequences);
}
$params['kind'] = $sequences[0];
$params['union'] = isset($sequences['UNION']);
$params['write'] = !\in_array($params['kind'], self::$read_kinds, true);
$params['structure'] = \in_array($params['kind'], self::$structure_kinds, true);
}
elseif (($this->getEngine() === 'sqlite') && (strpos($statement, 'PRAGMA') === 0)) {
$params['kind'] = 'PRAGMA';
}
else {
throw new \Exception(
\defined('BBN_IS_DEV') && BBN_IS_DEV
? "Impossible to parse the query $statement"
: 'Impossible to parse the query'
);
}
// This will add to the queries array
$this->_add_query(
$hash,
$statement,
$params['kind'],
$placeholders,
$driver_options
);
if (!empty($hash_sent)) {
$this->queries[$hash_sent] = $hash;
}
}
// The hash of the hash for retrieving a query based on the helper's config's hash
elseif (\is_string($this->queries[$hash])) {
$hash = $this->queries[$hash];
}
$this->_update_query($hash);
$q =& $this->queries[$hash];
/* If the number of values is inferior to the number of placeholders we fill the values with the last given value */
if (!empty($params['values']) && ($num_values < $q['placeholders'])) {
$this->error(X::_("Placeholders and values don't match"), false);
$params['values'] = array_merge(
$params['values'],
array_fill($num_values, $q['placeholders'] - $num_values, end($params['values']))
);
$num_values = \count($params['values']);
}
/* The number of values must match the number of placeholders to bind */
if ($num_values !== $q['placeholders']) {
$this->error(
X::_('Incorrect arguments count (your values: %u, in the statement: %u)', $num_values, $q['placeholders'])."\n\n"
. $statement."\n\n".'Number of values'.count($params['values']).'Arguments:'
. print_r(\func_get_args(), true)
. print_r($q, true),
false
);
exit;
}
if ($q['exe_time'] === 0) {
$time = $q['last'];
}
// That will always contain the parameters of the last query done
$this->addStatement($q['sql'], $params);
// If the statement is a structure modifier we need to clear the cache
if ($q['structure']) {
$tmp = $q;
$this->queries = [$hash => $tmp];
$this->list_queries = [[
'hash' => $hash,
'last' => $tmp['last']
]];
unset($tmp);
/** @todo Clear the cache */
}
try{
// This is a writing statement, it will execute the statement and return the number of affected rows
if ($q['write']) {
// A prepared query already exists for the writing
/** @var \bbn\Db\Query */
if ($q['prepared']) {
$r = $q['prepared']->init($params['values'])->execute();
}
// If there are no values we can assume the statement doesn't need to be prepared and is just executed
elseif ($num_values === 0) {
// Native PDO function which returns the number of affected rows
$r = $this->pdo->exec($q['sql']);
}
// Preparing the query
else{
// Native PDO function which will use Db\Query as base class
/** @var \bbn\Db\Query */
$q['prepared'] = $this->pdo->prepare($q['sql'], $q['options']);
$r = $q['prepared']->execute();
}
}
// This is a reading statement, it will prepare the statement and return a query object
else{
if (!$q['prepared']) {
// Native PDO function which will use Db\Query as base class
$q['prepared'] = $this->pdo->prepare($q['sql'], $driver_options);
}
else{
// Returns the same Db\Query object
$q['prepared']->init($params['values']);
}
}
if (!empty($time) && ($q['exe_time'] === 0)) {
$q['exe_time'] = microtime(true) - $time;
}
}
catch (\PDOException $e) {
$this->error($e);
}
if ($this->check()) {
// So if read statement returns the query object
if (!$q['write']) {
return $q['prepared'];
}
// If it is a write statement returns the number of affected rows
if ($q['prepared'] && $q['write']) {
$r = $q['prepared']->rowCount();
}
// If it is an insert statement we (try to) set the last inserted ID
if (($q['kind'] === 'INSERT') && $r) {
$this->setLastInsertId();
}
if (!isset($r)) {
X::log($q, 'no_r_in_sql');
return false;
}
return $r ?: false;
}
}
}
Executes a writing statement and return the number of affected rows or return a query object for the reading * statement BBN is a suite of PHP and JS libraries and VueJS components - all open-source! bbn.io, build applications, the quick way
This website uses cookies to ensure you get the best experience on our website.
© 2011-2024
BBN Solutions