/** * Retourne la dernière erreur generée * * @param string $query * Requête qui était exécutée * @param string $serveur * Nom de la connexion * @return string * Erreur eventuelle **/ function spip_sqlite_error($query = '', $serveur = '') { $link = _sqlite_link($serveur); if (_sqlite_is_version(3, $link)) { $errs = $link->errorInfo(); /* $errs[0] numero SQLState ('HY000' souvent lors d'une erreur) http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html $errs[1] numéro d'erreur SQLite (souvent 1 lors d'une erreur) http://www.sqlite.org/c3ref/c_abort.html $errs[2] Le texte du message d'erreur */ $s = ''; if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur $s = "{$errs['2']}"; } } elseif ($link) { $s = sqlite_error_string(sqlite_last_error($link)); } else { $s = ": aucune ressource sqlite (link)"; } if ($s) { $trace = debug_backtrace(); if ($trace[0]['function'] != "spip_mysql_error") { spip_log("{$s} - {$query} - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR); } } return $s; }
/** * Retourne la dernière erreur generée * * @note * Bien spécifier le serveur auquel on s'adresse, * mais à l'install la globale n'est pas encore complètement définie. * * @param string $query * Requête qui était exécutée * @param string $serveur * Nom de la connexion * @param bool $requeter * Inutilisé * @return string * Erreur eventuelle **/ function spip_mysql_error($query = '', $serveur = '', $requeter = true) { $link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link']; $s = mysqli_error($link); if ($s) { $trace = debug_backtrace(); if ($trace[0]['function'] != "spip_mysql_error") { spip_log("{$s} - {$query} - " . sql_error_backtrace(), 'mysql.' . _LOG_ERREUR); } } return $s; }
/** * Effectue une requête de selection * * Fonction de selection (SELECT), retournant la ressource interrogeable par sql_fetch. * * @api * @see sql_fetch() Pour boucler sur les resultats de cette fonction * * @param array|string $select * Liste des champs a recuperer (Select) * @param array|string $from * Tables a consulter (From) * @param array|string $where * Conditions a remplir (Where) * @param array|string $groupby * Critere de regroupement (Group by) * @param array|string $orderby * Tableau de classement (Order By) * @param string $limit * Critere de limite (Limit) * @param array $having * Tableau des des post-conditions a remplir (Having) * @param string $serveur * Le serveur sollicite (pour retrouver la connexion) * @param bool|string $option * Peut avoir 3 valeurs : * * - false -> ne pas l'exécuter mais la retourner, * - continue -> ne pas echouer en cas de serveur sql indisponible, * - true|array -> executer la requête. * Le cas array est, pour une requete produite par le compilateur, * un tableau donnnant le contexte afin d'indiquer le lieu de l'erreur au besoin * * * @return mixed * Ressource SQL * * - Ressource SQL pour sql_fetch, si la requete est correcte * - false en cas d'erreur * - Chaine contenant la requete avec $option=false * * Retourne false en cas d'erreur, apres l'avoir denoncee. * Les portages doivent retourner la requete elle-meme en cas d'erreur, * afin de disposer du texte brut. * **/ function sql_select($select = array(), $from = array(), $where = array(), $groupby = array(), $orderby = array(), $limit = '', $having = array(), $serveur = '', $option = true) { $f = sql_serveur('select', $serveur, $option === 'continue' or $option === false); if (!is_string($f) or !$f) { return false; } $debug = (defined('_VAR_MODE') and _VAR_MODE == 'debug'); if ($option !== false and !$debug) { $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, is_array($option) ? true : $option); } else { $query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); if (!$option) { return $query; } // le debug, c'est pour ce qui a ete produit par le compilateur if (isset($GLOBALS['debug']['aucasou'])) { list($table, $id, ) = $GLOBALS['debug']['aucasou']; $nom = $GLOBALS['debug_objets']['courant'] . $id; $GLOBALS['debug_objets']['requete'][$nom] = $query; } $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true); } // en cas d'erreur if (!is_string($res)) { return $res; } // denoncer l'erreur SQL dans sa version brute spip_sql_erreur($serveur); // idem dans sa version squelette (prefixe des tables non substitue) $contexte_compil = sql_error_backtrace(true); erreur_squelette(array(sql_errno($serveur), sql_error($serveur), $res), $contexte_compil); return false; }
/** * Log la dernière erreur SQL présente sur la connexion indiquée * * @param string $serveur Nom du connecteur de bdd utilisé **/ function spip_sql_erreur($serveur = '') { $connexion = spip_connect($serveur); $e = sql_errno($serveur); $t = isset($connexion['type']) ? $connexion['type'] : 'sql'; $m = "Erreur {$e} de {$t}: " . sql_error($serveur) . "\nin " . sql_error_backtrace() . "\n" . trim($connexion['last']); $f = $t . $serveur; spip_log($m, $f . '.' . _LOG_ERREUR); }