Exemple #1
0
/**
 * 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;
}
Exemple #2
0
/**
 * 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;
}
Exemple #4
0
/**
 * 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);
}