Pb de changement de date dans un article

Bonjour,
Je suis en SPIP 3.0.17, et Sarka-SPIP 3.2.36.
Quand je veux mettre une date d'un article à 0000 (pour ne pas l'afficher), j'ai le message suivant :

--- DEBUT ---
Warning: mktime() expects parameter 4 to be long, string given in /var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php on line 227

Warning: Cannot modify header information - headers already sent by (output started at /var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php:227) in /var/www/internet22.catholique.fr/docs/ecrire/inc/actions.php on line 89
--- FIN ---

Or sr un autre site (mutualisé avec le précédent) *cela est possible et il n'y a pas de message d'erreur*...
Vos lumières ?
Merci d'avance !

--
Philippe G.

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.
http://www.avast.com

Le 17.09.14 10:34, Philippe G. a écrit :

Bonjour,
Je suis en SPIP 3.0.17, et Sarka-SPIP 3.2.36.
Quand je veux mettre une date d'un article à 0000 (pour ne pas
l'afficher), j'ai le message suivant :

--- DEBUT ---
Warning: mktime() expects parameter 4 to be long, string given in
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php on
line 227

Warning: Cannot modify header information - headers already sent by
(output started at
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php:227)
in /var/www/internet22.catholique.fr/docs/ecrire/inc/actions.php on line 89
--- FIN ---

Or sr un autre site (mutualisé avec le précédent) *cela est possible et
il n'y a pas de message d'erreur*...
Vos lumières ?
Merci d'avance !

des plugins différents sur l'un et l'autre?

--
Maïeul

Le 17/09/2014 21:05, Maïeul a écrit :

Le 17.09.14 10:34, Philippe G. a écrit :

Bonjour,
Je suis en SPIP 3.0.17, et Sarka-SPIP 3.2.36.
Quand je veux mettre une date d'un article à 0000 (pour ne pas
l'afficher), j'ai le message suivant :

--- DEBUT ---
Warning: mktime() expects parameter 4 to be long, string given in
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php on
line 227

Warning: Cannot modify header information - headers already sent by
(output started at
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php:227)
in /var/www/internet22.catholique.fr/docs/ecrire/inc/actions.php on
line 89
--- FIN ---

Or sr un autre site (mutualisé avec le précédent) *cela est possible et
il n'y a pas de message d'erreur*...
Vos lumières ?
Merci d'avance !

des plugins différents sur l'un et l'autre?

Puisque les sites sont mutualisés, les plugins sont les mêmes pour toutes les installations de SPIP.

--
Philippe G.

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.

Le 17/09/2014 22:35, Philippe G. a écrit :

des plugins différents sur l'un et l'autre?

Puisque les sites sont mutualisés, les plugins sont les mêmes pour
toutes les installations de SPIP.

Mais sont-ils activés de la même façon sur tous les sites ?

CM

Le 17/09/2014 22:44, Christian Marget a écrit :

Le 17/09/2014 22:35, Philippe G. a écrit :

des plugins différents sur l'un et l'autre?

Puisque les sites sont mutualisés, les plugins sont les mêmes pour
toutes les installations de SPIP.

Mais sont-ils activés de la même façon sur tous les sites ?

J'ai fais le test et comparé deux sites mutualisés, un avec qui ça marche et un avec qui ça ne marche pas : ils ont les mêmes plugins configurés pareil.
Une piste serait de me dire ce ue signifie réellement les deux messages d'erreur, ça pourrait me guider :
J'obiens ces messages quand je mets la date à 0000. je récupère un affichage "Format date incorrect" et ces deux messages :

Warning: mktime() expects parameter 4 to be long, string given in /var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php on line 227

Warning: Cannot modify header information - headers already sent by (output started at /var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php:227) in /var/www/internet22.catholique.fr/docs/ecrire/inc/actions.php on line 89

--
Philippe G.

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.

Pour le message 2 tu dois avoir un script php avec un echo mal placé genre au-dessus d'une redirection ou quelque chose comme ça.
Pour la 1 , il est possible qu'il y est une erreur également dans la déclaration de mktime qui attend un entier dans le quatrième paramètre.

Philippe G. a écrit :

Le 17/09/2014 22:44, Christian Marget a écrit :

Le 17/09/2014 22:35, Philippe G. a écrit :

des plugins différents sur l'un et l'autre?

Puisque les sites sont mutualisés, les plugins sont les mêmes pour
toutes les installations de SPIP.

Mais sont-ils activés de la même façon sur tous les sites ?

J'ai fais le test et comparé deux sites mutualisés, un avec qui ça marche et un avec qui ça ne marche pas : ils ont les mêmes plugins configurés pareil.
Une piste serait de me dire ce ue signifie réellement les deux messages d'erreur, ça pourrait me guider :
J'obiens ces messages quand je mets la date à 0000. je récupère un affichage "Format date incorrect" et ces deux messages :

Warning: mktime() expects parameter 4 to be long, string given in /var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php on line 227

Warning: Cannot modify header information - headers already sent by (output started at /var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php:227) in /var/www/internet22.catholique.fr/docs/ecrire/inc/actions.php on line 89

Le 2ème message n’apporte aucune information (il n’est qu’une conséquence logique et incontournable du précédent : on veut écrire dans le header, ce qui n’est possible que si le flux de sortie est vide ; or le 1er message vient d’être affiché, c’est-à-dire envoyé dans le flux de sortie).

Le 1er message, lui, témoigne que la fonction mktime(), qui calcule une date au format Unix à partir de ses composants unitaires (heure, minute, seconde, mois, jour année, qui doivent tous être fournis sous forme numérique), a reçu son 4ème argument (mois) sous forme de chaîne (par exemple “septembre” au lieu de “9”).

Ca suggère donc que, sur un site où ça ne marche pas, la source où le mktime() puise son information “date” serait du genre “18 septembre 2014”, alors qu’elle serait du genre “18/09/2014” là où ça marche (cas normal).
A partir de là, je pensais d’abord que je ne pouvais rien dire de plus, puisqu’on se demande pourquoi, en interne et pendant le traitement du changement de date, celle-ci pourrait être exprimée sous forme “lisible”.
D’autant plus qu’en regardant le script incriminé (prive/formulaires/dater.php), dans la version de Spip dont je dispose (3.0.17), je ne trouvais même pas d’appel à mktime() : ça semblait complètement dénué de sens !

A tel point que j’ai envisagé qu’il s’agisse d’une version plus récente, où on a introduit l’utilisation de mktime().
J’ai donc été voir ce qui est disponible en ligne sur core.spip.org, et je trouve la révision 21495 (http://core.spip.org/projects/spip/repository/revisions/21495) qui utilise bien mktime()… mais sur un n° de ligne (285) très éloigné du 227 cité par l’erreur !
D’où je déduis que la version de Spip dans laquelle on a l’erreur est encore une autre, plus récente que la mienne mais moins que cette 21495.

Alors pour aller plus loin il faudrait regarder directement le code de ce script dater.php dans la version en cause : si tu en mets une copie dans une réponse sur la liste, on pourra réfléchir sur des bases sûres.

Dernier point dans l’immédiat : comme il s’agit de mutualisé, je crois savoir que ça signifie notamment que l’ensemble des scripts Spip est unique pour tous les sites, non ?
Si c’est bien le cas, ça ramène au mystère de “pourquoi la différence” ?
Auquel cas on peut envisager que d’un site à l’autre, ça soit piloté par des php.ini différents : là où ça marche, c’est simplement que error_reporting est configuré pour ne pas faire apparaître les warning (option par défaut pour un site en production), alors que l’erreur se produit tout de même… mais silencieusement !

Mais encore une fois, il faudrait d’abord être sûr de voir le bon script.

Fred

From: Philippe G.
Sent: Thursday, September 18, 2014 8:29 AM
To: spip@rezo.net
Subject: Re: [Spip] Pb de changement de date dans un article

Le 17/09/2014 22:44, Christian Marget a écrit :

Le 17/09/2014 22:35, Philippe G. a écrit :

des plugins différents sur l’un et l’autre?

Puisque les sites sont mutualisés, les plugins sont les mêmes pour
toutes les installations de SPIP.

Mais sont-ils activés de la même façon sur tous les sites ?

J’ai fais le test et comparé deux sites mutualisés, un avec qui ça
marche et un avec qui ça ne marche pas : ils ont les mêmes plugins
configurés pareil.
Une piste serait de me dire ce ue signifie réellement les deux messages
d’erreur, ça pourrait me guider :
J’obiens ces messages quand je mets la date à 0000. je récupère un
affichage « Format date incorrect » et ces deux messages :

Warning: mktime() expects parameter 4 to be long, string given in
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php on
line 227

Warning: Cannot modify header information - headers already sent by
(output started at
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php:227)
in /var/www/internet22.catholique.fr/docs/ecrire/inc/actions.php on line 89


Philippe G.


Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

Le 18/09/2014 15:25, Bernard Blazin a écrit :

Pour le message 2 tu dois avoir un script php avec un echo mal placé
genre au-dessus d'une redirection ou quelque chose comme ça.
Pour la 1 , il est possible qu'il y est une erreur également dans la
déclaration de mktime qui attend un entier dans le quatrième paramètre.

Le problème : cela se passe sur des sites mutualisés donc avec tous le *même* code source ( SPIP + Sarka-SPIP + plugin) et sur un site ça marche et sur un autre cela ne marche pas... :frowning:

Philippe G. a écrit :

Le 17/09/2014 22:44, Christian Marget a écrit :

Le 17/09/2014 22:35, Philippe G. a écrit :

des plugins différents sur l'un et l'autre?

Puisque les sites sont mutualisés, les plugins sont les mêmes pour
toutes les installations de SPIP.

Mais sont-ils activés de la même façon sur tous les sites ?

J'ai fais le test et comparé deux sites mutualisés, un avec qui ça
marche et un avec qui ça ne marche pas : ils ont les mêmes plugins
configurés pareil.
Une piste serait de me dire ce ue signifie réellement les deux
messages d'erreur, ça pourrait me guider :
J'obiens ces messages quand je mets la date à 0000. je récupère un
affichage "Format date incorrect" et ces deux messages :

Warning: mktime() expects parameter 4 to be long, string given in
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php on
line 227

Warning: Cannot modify header information - headers already sent by
(output started at
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php:227) in
/var/www/internet22.catholique.fr/docs/ecrire/inc/actions.php on line 89

--
Philippe G.

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.

Le 18/09/2014 16:48, cFreed a écrit :

Le 2ème message n’apporte aucune information (il n’est qu’une
(...)

Très belle analyse dont je te remercie ! Mais comme "je" suis mutualisé, ce sont les mêmes scripts pour tout le monde !

Dernier point dans l’immédiat : comme il s’agit de mutualisé, je crois
savoir que ça signifie notamment que l’ensemble des scripts Spip est
unique pour tous les sites, non ?

Exact !

Si c’est bien le cas, ça ramène au mystère de “pourquoi la différence” ?

Eh oui...

Auquel cas on peut envisager que d’un site à l’autre, ça soit piloté par
des php.ini différents : là où ça marche, c’est simplement que
error_reporting est configuré pour ne pas faire apparaître les warning
(option par défaut pour un site en production), alors que l’erreur se
produit tout de même... mais silencieusement !
Mais encore une fois, il faudrait d’abord être sûr de voir le bon script.

En gros, on a sous la racine un répertoire /sites dans lesquels on met les sites mutualisés, dans une rubrique avec l'adresse du site du genre www.monsite.org. Dans ce répertoire on trouve les répertoires suivants :
/config
/local
/IMG
/squelettes
/tmp

Pour ma part dans /squelettes dans le site qui marche mal, il y a juste les css (/css) et deux réperoires images /images et /img
J'ai naturellement vidé /tmp à chaque fois manuellement...

--
Philippe G.

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.

Tu peux écrire ici ce qu'il y a dans dater.php ça va aider je pense à trouver le problème

Philippe G. a écrit :

Le 18/09/2014 15:25, Bernard Blazin a écrit :

Pour le message 2 tu dois avoir un script php avec un echo mal placé
genre au-dessus d'une redirection ou quelque chose comme ça.
Pour la 1 , il est possible qu'il y est une erreur également dans la
déclaration de mktime qui attend un entier dans le quatrième paramètre.

Le problème : cela se passe sur des sites mutualisés donc avec tous le *même* code source ( SPIP + Sarka-SPIP + plugin) et sur un site ça marche et sur un autre cela ne marche pas... :frowning:

Philippe G. a écrit :

Le 17/09/2014 22:44, Christian Marget a écrit :

Le 17/09/2014 22:35, Philippe G. a écrit :

des plugins différents sur l'un et l'autre?

Puisque les sites sont mutualisés, les plugins sont les mêmes pour
toutes les installations de SPIP.

Mais sont-ils activés de la même façon sur tous les sites ?

J'ai fais le test et comparé deux sites mutualisés, un avec qui ça
marche et un avec qui ça ne marche pas : ils ont les mêmes plugins
configurés pareil.
Une piste serait de me dire ce ue signifie réellement les deux
messages d'erreur, ça pourrait me guider :
J'obiens ces messages quand je mets la date à 0000. je récupère un
affichage "Format date incorrect" et ces deux messages :

Warning: mktime() expects parameter 4 to be long, string given in
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php on
line 227

Warning: Cannot modify header information - headers already sent by
(output started at
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php:227) in
/var/www/internet22.catholique.fr/docs/ecrire/inc/actions.php on line 89

Le 19/09/2014 15:09, Bernard Blazin a écrit :

Tu peux écrire ici ce qu'il y a dans dater.php ça va aider je pense à
trouver le problème

Voilà :

--- DEBUT ---
?php

/***************************************************************************\
  * SPIP, Systeme de publication pour l'internet *
  * *
  * Copyright (c) 2001-2014 *
  * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  * *
  * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/

if (!defined('_ECRIRE_INC_VERSION')) return;

function formulaires_dater_charger_dist($objet, $id_objet, $retour='', $options=array()){

  $objet = objet_type($objet);
  if (!$objet OR !intval($id_objet))
    return false;

  if (!is_array($options))
    $options = unserialize($options);

  $_id_objet = id_table_objet($objet);
  $table = table_objet($objet);
  $trouver_table = charger_fonction('trouver_table','base');
  $desc = $trouver_table($table);

  if (!$desc)
    return false;

  $champ_date = $desc['date']?$desc['date']:'date';
  if (!isset($desc['field'][$champ_date]))
    return false;

  $valeurs = array(
    'objet'=>$objet,
    'id_objet'=>$id_objet,
    'id'=>$id_objet,
  );

  $select = "$champ_date as date";
  if (isset($desc['field']['date_redac']))
    $select .= ",date_redac";
  if (isset($desc['field']['statut']))
    $select .= ",statut";

  $row = sql_fetsel($select, $desc['table'], "$_id_objet=".intval($id_objet));
  $statut = isset($row['statut'])?$row['statut']:'publie'; // pas de statut => publie

  $valeurs['editable'] = autoriser('dater',$objet,$id_objet,null,array('statut'=>$statut));

  $possedeDateRedac = false;

  if (isset($row['date_redac']) AND
    $regs = recup_date($row['date_redac'], false)) {
    $annee_redac = $regs[0];
    $mois_redac = $regs[1];
    $jour_redac = $regs[2];
    $heure_redac = $regs[3];
    $minute_redac = $regs[4];
    $possedeDateRedac = true;
    // attention : les vrai dates de l'annee 1 sont stockee avec +9000 => 9001
    // mais reviennent ici en annee 1 par recup_date
    // on verifie donc que le intval($row['date_redac']) qui ressort l'annee
    // est bien lui aussi <=1 : dans ce cas c'est une date sql 'nulle' ou presque, selon
    // le gestionnnaire sql utilise (0001-01-01 pour PG par exemple)
    if (intval($row['date_redac'])<=1 AND ($annee_redac<=1) AND ($mois_redac<=1) AND ($jour_redac<=1))
      $possedeDateRedac = false;
  }
  else
    $annee_redac = $mois_redac = $jour_redac = $heure_redac = $minute_redac = 0;

  if ($regs = recup_date($row['date'], false)) {
    $annee = $regs[0];
    $mois = $regs[1];
    $jour = $regs[2];
    $heure = $regs[3];
    $minute = $regs[4];
  }

  // attention, si la variable s'appelle date ou date_redac, le compilo va
  // la normaliser, ce qu'on ne veut pas ici.
  $valeurs['afficher_date_redac'] = ($possedeDateRedac?$row['date_redac']:'');
  $valeurs['date_redac_jour'] = dater_formater_saisie_jour($jour_redac,$mois_redac,$annee_redac);
  $valeurs['date_redac_heure'] = "$heure_redac:$minute_redac";

  $valeurs['afficher_date'] = $row['date'];
  $valeurs['date_jour'] = dater_formater_saisie_jour($jour,$mois,$annee);
  $valeurs['date_heure'] = "$heure:$minute";

  $valeurs['sans_redac'] = !$possedeDateRedac;

  if (isset($options['date_redac']))
    $valeurs['_editer_date_anterieure'] = $options['date_redac'];
  else
    $valeurs['_editer_date_anterieure'] = ($objet=='article' AND ($GLOBALS['meta']["articles_redac"] != 'non' OR $possedeDateRedac));
  $valeurs['_label_date'] = (($statut == 'publie')? _T('texte_date_publication_objet'): _T('texte_date_creation_objet'));
  $valeurs['_saisie_en_cours'] = (_request('date_jour')!==null);

  return $valeurs;
}

function dater_formater_saisie_jour($jour,$mois,$annee,$sep="/"){
  $annee = str_pad($annee,4,'0',STR_PAD_LEFT);
  if (intval($jour)){
    $jour = str_pad($jour,2,'0',STR_PAD_LEFT);
    $mois = str_pad($mois,2,'0',STR_PAD_LEFT);
    return "$jour$sep$mois$sep$annee";
  }
  if (intval($mois)) {
    $mois = str_pad($mois,2,'0',STR_PAD_LEFT);
    return "$mois$sep$annee";
  }
  return $annee;
}
/**
  * Identifier le formulaire en faisant abstraction des parametres qui
  * ne representent pas l'objet edite
  */
function formulaires_dater_identifier_dist($objet, $id_objet, $retour='', $options=array()){
  return serialize(array($objet, $id_objet));
}

/**
  * Verification avant traitement
  *
  * On verifie que l'upload s'est bien passe et
  * que le document recu est une image (d'apres son extension)
  *
  * @param string $objet
  * @param integer $id_objet
  * @param string $retour
  * @return Array Tableau des erreurs
  */
function formulaires_dater_verifier_dist($objet, $id_objet, $retour=''){
  $erreurs = array();

  foreach(array('date','date_redac') as $k){
    if ($v=_request($k."_jour") AND !dater_recuperer_date_saisie($v, $k))
      $erreurs[$k] = _T('format_date_incorrecte');
    elseif ($v=_request($k."_heure") AND !dater_recuperer_heure_saisie($v))
      $erreurs[$k] = _T('format_heure_incorrecte');
  }

  if (!_request('date_jour'))
    $erreurs['date'] = _T('info_obligatoire');

  return $erreurs;
}

/**
  * Traitement
  *
  * @param string $objet
  * @param integer $id_objet
  * @param string $retour
  * @return Array
  */
function formulaires_dater_traiter_dist($objet, $id_objet, $retour=''){
  $res = array('editable'=>' ');

  if (_request('changer')){
    $_id_objet = id_table_objet($objet);
    $table = table_objet($objet);
    $trouver_table = charger_fonction('trouver_table','base');
    $desc = $trouver_table($table);

    if (!$desc)
      return array('message_erreur'=>_L('erreur')); #impossible en principe

    $champ_date = $desc['date']?$desc['date']:'date';

    $set = array();

    if (!$d = dater_recuperer_date_saisie(_request('date_jour')))
      $d = array(date('Y'),date('m'),date('d'));
    if (!$h = dater_recuperer_heure_saisie(_request('date_heure')))
      $h = array(0,0);

    $set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);

    if (isset($desc['field']['date_redac'])){
      if (!_request('date_redac_jour') OR _request('sans_redac'))
        $set['date_redac'] = sql_format_date(0,0,0,0,0,0);
      else {
        if (!$d = dater_recuperer_date_saisie(_request('date_redac_jour'), "date_redac"))
          $d = array(date('Y'),date('m'),date('d'));
        if (!$h = dater_recuperer_heure_saisie(_request('date_redac_heure')))
          $h = array(0,0);
        $set['date_redac'] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
      }
    }
    include_spip('action/editer_objet');
    objet_modifier($objet, $id_objet, $set);
  }

  if ($retour)
    $res['redirect'] = $retour;

  set_request('date_jour');
  set_request('date_redac_jour');
  set_request('date_heure');
  set_request('date_redac_heure');

  return $res;
}

/**
  * Recuperer annee,mois,jour sur la date saisie
  * @param string $post
  * @param string $quoi
  * @return array
  */
function dater_recuperer_date_saisie($post, $quoi="date") {
  if (!preg_match('#^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})#', $post, $regs))
    return '';
  if ($quoi=="date_redac") {
    if ($regs[3]<>'' AND $regs[3] < 1001)
      $regs[3] += 9000;

    return array($regs[3],$regs[2],$regs[1]);
  }
  else {
    $t = mktime(0,0,0,$regs[2],$regs[1],$regs[3]);
    // si la date n'est pas valide selon mktime, la refuser
    if (!$t) return '';
    return array(date('Y',$t),date('m',$t),date('d',$t));
  }

}

/**
  * Recuperer heures,minutes sur l'heure saisie
  * @param string $post
  * @return array
  */
function dater_recuperer_heure_saisie($post) {
  if (!preg_match('#([0-9]{1,2})(?:[h:](?:([0-9]{1,2}))?)?#', $post, $regs))
    return '';
  return array($regs[1],$regs[2]);
}

?>
--- FIN ---

--
Philippe G.

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.

Je répète qu’il faudrait de toutes façons voir le contenu de la version actuelle du script dater.php.
C’est fondamental de pouvoir être sûr de savoir comment celui-là travaille.

D’autre part, il serait bon de contrôler l’hypothèse d’une différence simplement due à l’affichage des erreurs.
Pour ce faire, successivement sur un site qui marche et sur un site qui ne marche pas : …lesite/ecrire/?exec=info et relever la valeur (locale) de error_reporting.

Fred

From: Philippe G.
Sent: Friday, September 19, 2014 12:18 PM
To: spip@rezo.net
Subject: Re: [Spip] Pb de changement de date dans un article

Le 18/09/2014 16:48, cFreed a écrit :

Le 2ème message n’apporte aucune information (il n’est qu’une
(…)

Très belle analyse dont je te remercie ! Mais comme « je » suis mutualisé,
ce sont les mêmes scripts pour tout le monde !

Dernier point dans l’immédiat : comme il s’agit de mutualisé, je crois
savoir que ça signifie notamment que l’ensemble des scripts Spip est
unique pour tous les sites, non ?

Exact !

Si c’est bien le cas, ça ramène au mystère de “pourquoi la différence” ?

Eh oui…

Auquel cas on peut envisager que d’un site à l’autre, ça soit piloté par
des php.ini différents : là où ça marche, c’est simplement que
error_reporting est configuré pour ne pas faire apparaître les warning
(option par défaut pour un site en production), alors que l’erreur se
produit tout de même… mais silencieusement !
Mais encore une fois, il faudrait d’abord être sûr de voir le bon script.

En gros, on a sous la racine un répertoire /sites dans lesquels on met
les sites mutualisés, dans une rubrique avec l’adresse du site du genre
www.monsite.org. Dans ce répertoire on trouve les répertoires suivants :
/config
/local
/IMG
/squelettes
/tmp

Pour ma part dans /squelettes dans le site qui marche mal, il y a juste
les css (/css) et deux réperoires images /images et /img
J’ai naturellement vidé /tmp à chaque fois manuellement…


Philippe G.


Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

C’est après avoir posté ma réponse à ton message de 12:18 que je vois celui-ci, où finalement tu as déjà communiqué le contenu de dater.php.

Et là, grosse surprise : logiquement ça ne peut pas être ce script-là qui est en cause.
Parce que le message d’erreur sur mktime() cite la ligne 227, alors qu’ici le mktime() est en 249 !
Es-tu sûr d’avoir été chercher le dater.php dans le chemin cité par le message d’erreur : /var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php ?

Fred

From: Philippe G.
Sent: Friday, September 19, 2014 3:53 PM
To: spip@rezo.net
Subject: Re: [Spip] Pb de changement de date dans un article

Le 19/09/2014 15:09, Bernard Blazin a écrit :

Tu peux écrire ici ce qu’il y a dans dater.php ça va aider je pense à
trouver le problème

Voilà :

— DEBUT —
?php

/***************************************************************************\

  • SPIP, Systeme de publication pour l’internet
  • Copyright (c) 2001-2014
  • Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel
    Saint-James *
  • Ce programme est un logiciel libre distribue sous licence GNU/GPL.
  • Pour plus de details voir le fichier COPYING.txt ou l’aide en
    ligne. *
    ***************************************************************************/

if (!defined(‹ _ECRIRE_INC_VERSION ›)) return;

function formulaires_dater_charger_dist($objet, $id_objet, $retour=‹  ›,
$options=array()){

$objet = objet_type($objet);
if (!$objet OR !intval($id_objet))
return false;

if (!is_array($options))
$options = unserialize($options);

$_id_objet = id_table_objet($objet);
$table = table_objet($objet);
$trouver_table = charger_fonction(‹ trouver_table ›,‹ base ›);
$desc = $trouver_table($table);

if (!$desc)
return false;

$champ_date = $desc[‹ date ›]?$desc[‹ date ›]:‹ date ›;
if (!isset($desc[‹ field ›][$champ_date]))
return false;

$valeurs = array(
‹ objet ›=>$objet,
‹ id_objet ›=>$id_objet,
‹ id ›=>$id_objet,
);

$select = « $champ_date as date »;
if (isset($desc[‹ field ›][‹ date_redac ›]))
$select .= « ,date_redac »;
if (isset($desc[‹ field ›][‹ statut ›]))
$select .= « ,statut »;

$row = sql_fetsel($select, $desc[‹ table ›],
« $_id_objet= ».intval($id_objet));
$statut = isset($row[‹ statut ›])?$row[‹ statut ›]:‹ publie ›; // pas de
statut => publie

$valeurs[‹ editable ›] =
autoriser(‹ dater ›,$objet,$id_objet,null,array(‹ statut ›=>$statut));

$possedeDateRedac = false;

if (isset($row[‹ date_redac ›]) AND
$regs = recup_date($row[‹ date_redac ›], false)) {
$annee_redac = $regs[0];
$mois_redac = $regs[1];
$jour_redac = $regs[2];
$heure_redac = $regs[3];
$minute_redac = $regs[4];
$possedeDateRedac = true;
// attention : les vrai dates de l’annee 1 sont stockee avec +9000 => 9001
// mais reviennent ici en annee 1 par recup_date
// on verifie donc que le intval($row[‹ date_redac ›]) qui ressort l’annee
// est bien lui aussi <=1 : dans ce cas c’est une date sql ‹ nulle › ou
presque, selon
// le gestionnnaire sql utilise (0001-01-01 pour PG par exemple)
if (intval($row[‹ date_redac ›])<=1 AND ($annee_redac<=1) AND
($mois_redac<=1) AND ($jour_redac<=1))
$possedeDateRedac = false;
}
else
$annee_redac = $mois_redac = $jour_redac = $heure_redac =
$minute_redac = 0;

if ($regs = recup_date($row[‹ date ›], false)) {
$annee = $regs[0];
$mois = $regs[1];
$jour = $regs[2];
$heure = $regs[3];
$minute = $regs[4];
}

// attention, si la variable s’appelle date ou date_redac, le compilo va
// la normaliser, ce qu’on ne veut pas ici.
$valeurs[‹ afficher_date_redac ›] =
($possedeDateRedac?$row[‹ date_redac ›]:‹  ›);
$valeurs[‹ date_redac_jour ›] =
dater_formater_saisie_jour($jour_redac,$mois_redac,$annee_redac);
$valeurs[‹ date_redac_heure ›] = « $heure_redac:$minute_redac »;

$valeurs[‹ afficher_date ›] = $row[‹ date ›];
$valeurs[‹ date_jour ›] = dater_formater_saisie_jour($jour,$mois,$annee);
$valeurs[‹ date_heure ›] = « $heure:$minute »;

$valeurs[‹ sans_redac ›] = !$possedeDateRedac;

if (isset($options[‹ date_redac ›]))
$valeurs[‹ _editer_date_anterieure ›] = $options[‹ date_redac ›];
else
$valeurs[‹ _editer_date_anterieure ›] = ($objet==‹ article › AND
($GLOBALS[‹ meta ›][« articles_redac »] != ‹ non › OR $possedeDateRedac));
$valeurs[‹ _label_date ›] = (($statut == ‹ publie ›)?
_T(‹ texte_date_publication_objet ›): _T(‹ texte_date_creation_objet ›));
$valeurs[‹ _saisie_en_cours ›] = (_request(‹ date_jour ›)!==null);

return $valeurs;
}

function dater_formater_saisie_jour($jour,$mois,$annee,$sep=« / »){
$annee = str_pad($annee,4,‹ 0 ›,STR_PAD_LEFT);
if (intval($jour)){
$jour = str_pad($jour,2,‹ 0 ›,STR_PAD_LEFT);
$mois = str_pad($mois,2,‹ 0 ›,STR_PAD_LEFT);
return « $jour$sep$mois$sep$annee »;
}
if (intval($mois)) {
$mois = str_pad($mois,2,‹ 0 ›,STR_PAD_LEFT);
return « $mois$sep$annee »;
}
return $annee;
}
/**

  • Identifier le formulaire en faisant abstraction des parametres qui
  • ne representent pas l’objet edite
    */
    function formulaires_dater_identifier_dist($objet, $id_objet,
    $retour=‹  ›, $options=array()){
    return serialize(array($objet, $id_objet));
    }

/**

  • Verification avant traitement
  • On verifie que l’upload s’est bien passe et
  • que le document recu est une image (d’apres son extension)
  • @param string $objet
  • @param integer $id_objet
  • @param string $retour
  • @return Array Tableau des erreurs
    */
    function formulaires_dater_verifier_dist($objet, $id_objet, $retour=‹  ›){
    $erreurs = array();

foreach(array(‹ date ›,‹ date_redac ›) as $k){
if ($v=_request($k.« _jour ») AND !dater_recuperer_date_saisie($v, $k))
$erreurs[$k] = _T(‹ format_date_incorrecte ›);
elseif ($v=_request($k.« _heure ») AND !dater_recuperer_heure_saisie($v))
$erreurs[$k] = _T(‹ format_heure_incorrecte ›);
}

if (!_request(‹ date_jour ›))
$erreurs[‹ date ›] = _T(‹ info_obligatoire ›);

return $erreurs;
}

/**

  • Traitement
  • @param string $objet
  • @param integer $id_objet
  • @param string $retour
  • @return Array
    */
    function formulaires_dater_traiter_dist($objet, $id_objet, $retour=‹  ›){
    $res = array(‹ editable ›=>’ ');

if (_request(‹ changer ›)){
$_id_objet = id_table_objet($objet);
$table = table_objet($objet);
$trouver_table = charger_fonction(‹ trouver_table ›,‹ base ›);
$desc = $trouver_table($table);

if (!$desc)
return array(‹ message_erreur ›=>_L(‹ erreur ›)); #impossible en principe

$champ_date = $desc[‹ date ›]?$desc[‹ date ›]:‹ date ›;

$set = array();

if (!$d = dater_recuperer_date_saisie(_request(‹ date_jour ›)))
$d = array(date(‹ Y ›),date(‹ m ›),date(‹ d ›));
if (!$h = dater_recuperer_heure_saisie(_request(‹ date_heure ›)))
$h = array(0,0);

$set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);

if (isset($desc[‹ field ›][‹ date_redac ›])){
if (!_request(‹ date_redac_jour ›) OR _request(‹ sans_redac ›))
$set[‹ date_redac ›] = sql_format_date(0,0,0,0,0,0);
else {
if (!$d = dater_recuperer_date_saisie(_request(‹ date_redac_jour ›),
« date_redac »))
$d = array(date(‹ Y ›),date(‹ m ›),date(‹ d ›));
if (!$h = dater_recuperer_heure_saisie(_request(‹ date_redac_heure ›)))
$h = array(0,0);
$set[‹ date_redac ›] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
}
}
include_spip(‹ action/editer_objet ›);
objet_modifier($objet, $id_objet, $set);
}

if ($retour)
$res[‹ redirect ›] = $retour;

set_request(‹ date_jour ›);
set_request(‹ date_redac_jour ›);
set_request(‹ date_heure ›);
set_request(‹ date_redac_heure ›);

return $res;
}

/**

  • Recuperer annee,mois,jour sur la date saisie
  • @param string $post
  • @param string $quoi
  • @return array
    */
    function dater_recuperer_date_saisie($post, $quoi=« date ») {
    if
    (!preg_match(‹ #^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})# ›,
    $post, $regs))
    return ‹  ›;
    if ($quoi==« date_redac ») {
    if ($regs[3]<>‹  › AND $regs[3] < 1001)
    $regs[3] += 9000;

return array($regs[3],$regs[2],$regs[1]);
}
else {
$t = mktime(0,0,0,$regs[2],$regs[1],$regs[3]);
// si la date n’est pas valide selon mktime, la refuser
if (!$t) return ‹  ›;
return array(date(‹ Y ›,$t),date(‹ m ›,$t),date(‹ d ›,$t));
}

}

/**

  • Recuperer heures,minutes sur l’heure saisie
  • @param string $post
  • @return array
    */
    function dater_recuperer_heure_saisie($post) {
    if (!preg_match(‹ #([0-9]{1,2})(?:h:?)?# ›, $post, $regs))
    return ‹  ›;
    return array($regs[1],$regs[2]);
    }

?>
— FIN —


Philippe G.


Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

Le 19/09/2014 19:43, cFreed a écrit :

C’est après avoir posté ma réponse à ton message de 12:18 que je vois
celui-ci, où finalement tu as déjà communiqué le contenu de dater.php.
Et là, grosse surprise : logiquement ça ne peut pas être ce script-là
qui est en cause.
Parce que le message d’erreur sur mktime() cite la ligne 227, alors
qu’ici le mktime() est en 249 !
Es-tu sûr d’avoir été chercher le dater.php dans le chemin cité par le
message d’erreur :
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php ?

Je t'envoie en privé la copie de NotePad++ avec la partie de dater.php qui va bien.

Fred
*From:* Philippe G. <mailto:philippe.giron@orange.fr>
*Sent:* Friday, September 19, 2014 3:53 PM
*To:* spip@rezo.net <mailto:spip@rezo.net>
*Subject:* Re: [Spip] Pb de changement de date dans un article
Le 19/09/2014 15:09, Bernard Blazin a écrit :
> Tu peux écrire ici ce qu'il y a dans dater.php ça va aider je pense à
> trouver le problème

Voilà :

--- DEBUT ---
?php

/***************************************************************************\
* SPIP, Systeme de publication pour l'internet
      *
   *
*
   * Copyright (c) 2001-2014
*
   * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel
Saint-James *
   *
      *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL.
      *
   * Pour plus de details voir le fichier COPYING.txt ou l'aide en
ligne. *
\***************************************************************************/

if (!defined('_ECRIRE_INC_VERSION')) return;

function formulaires_dater_charger_dist($objet, $id_objet, $retour='',
$options=array()){

$objet = objet_type($objet);
if (!$objet OR !intval($id_objet))
return false;

if (!is_array($options))
$options = unserialize($options);

$_id_objet = id_table_objet($objet);
$table = table_objet($objet);
$trouver_table = charger_fonction('trouver_table','base');
$desc = $trouver_table($table);

if (!$desc)
return false;

$champ_date = $desc['date']?$desc['date']:'date';
if (!isset($desc['field'][$champ_date]))
return false;

$valeurs = array(
'objet'=>$objet,
'id_objet'=>$id_objet,
'id'=>$id_objet,
);

$select = "$champ_date as date";
if (isset($desc['field']['date_redac']))
$select .= ",date_redac";
if (isset($desc['field']['statut']))
$select .= ",statut";

$row = sql_fetsel($select, $desc['table'],
"$_id_objet=".intval($id_objet));
$statut = isset($row['statut'])?$row['statut']:'publie'; // pas de
statut => publie

$valeurs['editable'] =
autoriser('dater',$objet,$id_objet,null,array('statut'=>$statut));

$possedeDateRedac = false;

if (isset($row['date_redac']) AND
$regs = recup_date($row['date_redac'], false)) {
$annee_redac = $regs[0];
$mois_redac = $regs[1];
$jour_redac = $regs[2];
$heure_redac = $regs[3];
$minute_redac = $regs[4];
$possedeDateRedac = true;
// attention : les vrai dates de l'annee 1 sont stockee avec +9000 => 9001
// mais reviennent ici en annee 1 par recup_date
// on verifie donc que le intval($row['date_redac']) qui ressort l'annee
// est bien lui aussi <=1 : dans ce cas c'est une date sql 'nulle' ou
presque, selon
// le gestionnnaire sql utilise (0001-01-01 pour PG par exemple)
if (intval($row['date_redac'])<=1 AND ($annee_redac<=1) AND
($mois_redac<=1) AND ($jour_redac<=1))
$possedeDateRedac = false;
}
else
$annee_redac = $mois_redac = $jour_redac = $heure_redac =
$minute_redac = 0;

if ($regs = recup_date($row['date'], false)) {
$annee = $regs[0];
$mois = $regs[1];
$jour = $regs[2];
$heure = $regs[3];
$minute = $regs[4];
}

// attention, si la variable s'appelle date ou date_redac, le compilo va
// la normaliser, ce qu'on ne veut pas ici.
$valeurs['afficher_date_redac'] =
($possedeDateRedac?$row['date_redac']:'');
$valeurs['date_redac_jour'] =
dater_formater_saisie_jour($jour_redac,$mois_redac,$annee_redac);
$valeurs['date_redac_heure'] = "$heure_redac:$minute_redac";

$valeurs['afficher_date'] = $row['date'];
$valeurs['date_jour'] = dater_formater_saisie_jour($jour,$mois,$annee);
$valeurs['date_heure'] = "$heure:$minute";

$valeurs['sans_redac'] = !$possedeDateRedac;

if (isset($options['date_redac']))
$valeurs['_editer_date_anterieure'] = $options['date_redac'];
else
$valeurs['_editer_date_anterieure'] = ($objet=='article' AND
($GLOBALS['meta']["articles_redac"] != 'non' OR $possedeDateRedac));
$valeurs['_label_date'] = (($statut == 'publie')?
_T('texte_date_publication_objet'): _T('texte_date_creation_objet'));
$valeurs['_saisie_en_cours'] = (_request('date_jour')!==null);

return $valeurs;
}

function dater_formater_saisie_jour($jour,$mois,$annee,$sep="/"){
$annee = str_pad($annee,4,'0',STR_PAD_LEFT);
if (intval($jour)){
$jour = str_pad($jour,2,'0',STR_PAD_LEFT);
$mois = str_pad($mois,2,'0',STR_PAD_LEFT);
return "$jour$sep$mois$sep$annee";
}
if (intval($mois)) {
$mois = str_pad($mois,2,'0',STR_PAD_LEFT);
return "$mois$sep$annee";
}
return $annee;
}
/**
   * Identifier le formulaire en faisant abstraction des parametres qui
   * ne representent pas l'objet edite
*/
function formulaires_dater_identifier_dist($objet, $id_objet,
$retour='', $options=array()){
return serialize(array($objet, $id_objet));
}

/**
   * Verification avant traitement
*
   * On verifie que l'upload s'est bien passe et
   * que le document recu est une image (d'apres son extension)
   *
   * @param string $objet
   * @param integer $id_objet
   * @param string $retour
   * @return Array Tableau des erreurs
*/
function formulaires_dater_verifier_dist($objet, $id_objet, $retour=''){
$erreurs = array();

foreach(array('date','date_redac') as $k){
if ($v=_request($k."_jour") AND !dater_recuperer_date_saisie($v, $k))
$erreurs[$k] = _T('format_date_incorrecte');
elseif ($v=_request($k."_heure") AND !dater_recuperer_heure_saisie($v))
$erreurs[$k] = _T('format_heure_incorrecte');
}

if (!_request('date_jour'))
$erreurs['date'] = _T('info_obligatoire');

return $erreurs;
}

/**
   * Traitement
   *
   * @param string $objet
   * @param integer $id_objet
   * @param string $retour
   * @return Array
   */
function formulaires_dater_traiter_dist($objet, $id_objet, $retour=''){
$res = array('editable'=>' ');

if (_request('changer')){
$_id_objet = id_table_objet($objet);
$table = table_objet($objet);
$trouver_table = charger_fonction('trouver_table','base');
$desc = $trouver_table($table);

if (!$desc)
return array('message_erreur'=>_L('erreur')); #impossible en principe

$champ_date = $desc['date']?$desc['date']:'date';

$set = array();

if (!$d = dater_recuperer_date_saisie(_request('date_jour')))
$d = array(date('Y'),date('m'),date('d'));
if (!$h = dater_recuperer_heure_saisie(_request('date_heure')))
$h = array(0,0);

$set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);

if (isset($desc['field']['date_redac'])){
if (!_request('date_redac_jour') OR _request('sans_redac'))
$set['date_redac'] = sql_format_date(0,0,0,0,0,0);
else {
if (!$d = dater_recuperer_date_saisie(_request('date_redac_jour'),
"date_redac"))
$d = array(date('Y'),date('m'),date('d'));
if (!$h = dater_recuperer_heure_saisie(_request('date_redac_heure')))
$h = array(0,0);
$set['date_redac'] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
}
include_spip('action/editer_objet');
objet_modifier($objet, $id_objet, $set);
}

if ($retour)
$res['redirect'] = $retour;

set_request('date_jour');
set_request('date_redac_jour');
set_request('date_heure');
set_request('date_redac_heure');

return $res;
}

/**
   * Recuperer annee,mois,jour sur la date saisie
   * @param string $post
   * @param string $quoi
* @return array
   */
function dater_recuperer_date_saisie($post, $quoi="date") {
if
(!preg_match('#^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})#',

$post, $regs))
return '';
if ($quoi=="date_redac") {
if ($regs[3]<>'' AND $regs[3] < 1001)
$regs[3] += 9000;

return array($regs[3],$regs[2],$regs[1]);
}
else {
$t = mktime(0,0,0,$regs[2],$regs[1],$regs[3]);
// si la date n'est pas valide selon mktime, la refuser
if (!$t) return '';
return array(date('Y',$t),date('m',$t),date('d',$t));
}

}

/**
* Recuperer heures,minutes sur l'heure saisie
   * @param string $post
   * @return array
   */
function dater_recuperer_heure_saisie($post) {
if (!preg_match('#([0-9]{1,2})(?:[h:](?:([0-9]{1,2}))?)?#', $post, $regs))
return '';
return array($regs[1],$regs[2]);
}

?>
--- FIN ---

--
Philippe G.

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant
parce que la protection avast! Antivirus est active.
http://www.avast.com

_______________________________________________
liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc

--
Philippe G.

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.

Le 20/09/2014 11:12, Philippe G. a écrit :

Le 19/09/2014 19:43, cFreed a écrit :

C’est après avoir posté ma réponse à ton message de 12:18 que je vois
celui-ci, où finalement tu as déjà communiqué le contenu de dater.php.
Et là, grosse surprise : logiquement ça ne peut pas être ce script-là
qui est en cause.
Parce que le message d’erreur sur mktime() cite la ligne 227, alors
qu’ici le mktime() est en 249 !
Es-tu sûr d’avoir été chercher le dater.php dans le chemin cité par le
message d’erreur :
/var/www/internet22.catholique.fr/docs/prive/formulaires/dater.php ?

Je t'envoie en privé la copie de NotePad++ avec la partie de dater.php
qui va bien.

Le fait que cela marche dans un cas et pas dans l'autre n'est pas vraiment résolu même si cFreed, spipfactory et quelques autres m'ont aidé (merci! ).
Il fallait modifier le squelettes des articles concernés pour ne pas afficher la date, et la rubrique aussi par la même occasion.
Le plus compliqué : les sites sont mutualisés et surtout il fallait aller fouiller dans les noisettes qui s'appellent l'une et l'autre pour faire les modifications correcte en changeant à chaque fois le numéro de la rubrique concernée... :stuck_out_tongue:
Enfin, tout est bien qui finit bien ça marche.
Merci à _Eric_ de Sarka-Spip !

--
Philippe G.

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.