LupusMic

  • Signature
    Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
  • Site web
  • Nombre de sujets
    26
  • Nombre de messages
    1 684
  • Nombre de commentaires
    4
  • Nombre de news
    Aucune
  • Niveau en PHP
    Gourou

Ses derniers messages sur les forums

LupusMic
le 28/06/2013 à 02:25
Probleme calcul plage horaire
Je suis généreux aujourd'hui, je t'ai accordé une petite heure de mon temps. Oui, même pour un pro, ce genre de chose c'est long et assez pénible à faire. Voici donc une version un peu plus rationnelle :

<?php

/** Format and execute a SQL query
*/
function do_query($sql_fmt/*, args, ...*/)
{
$args = func_get_args();
array_shift($args);
$args = array_map($args, 'mysql_real_escape_string');
$sql = call_user_func_array('sprintf', $args);
$result = mysql_query($sql);

if(false === $result)
trigger_error(mysql_error());

return $result;
}

function sql_value_format($length)
{
return implode(', ', array_pad(array(), $length, '\'%s\''))
}

function do_query_insert($table_name, $value_fields, $expr_fields = array())
{
$fields = array_merge(array_keys($value_fields), array_keys($expr_fields));

$values_fmt = array();
$values_fmt[] = sql_value_format(count($value_fields));
$values_fmt[] = implode(', ', $expr_fields));
$values_fmt = implode(', ', $values_fmt);

$sql_fmt = sprintf('INSERT INTO %s (%s) values (%s)'
, $table_name
, implode(', ', $fields)
, $values_fmt
);

$result = do_query($sql_fmt, array_values($value_fields));

return mysql_insert_id();
}

//// TODO: put that wild code in a function

$infos = array();

$etdate = date('Y-m-d', date_offset(date_lundi($_SESSION['date']),$_POST['jour']-1));
$etdebut_new = "{$_POST['hh_deb']}:{$_POST['mm_deb']}:00";
$etduree = "{$_POST['hh_dur']}:{$_POST['mm_dur']}:00";
$etdebut_exist = $_SESSION['paperboard'][4]['et_debut'];

// result isn't a good var name, it should be renamed with semantic
$result = do_query('SELECT id_et FROM emptps
WHERE id_mat=\'%s\'
AND et_date=\'%s\'
AND et_debut=\'%s\'
AND id_gr=%s
AND id_form=%s
', $_POST['mat'], $etdate, $etdebut_new, $_POST['group'], $_SESSION['form']);

// Le code que j'ai ajouter //
echo "<br>";
// 15 minutes en dec
$temps = 25*3600/100;
// Heure de durée en dec
$etduree = $etduree*3600;
// Heure de début en dec
$etdebut = $etdebut_new*3600;
// Heure de fin en dec
$etfin = $etduree + $etdebut;

for($i = $etdebut; $i != $etfin; $i += $temps)
{
$heure = date('H:i:s', $i);
echo'<option value="'.$heure.'">'.$heure.'</option>';
$result2 = do_query('SELECT et_debut FROM emptps
WHERE et_date=\'%s\'
AND et_debut=\'%s\'
', $etdate, $etdebut_exist);
if($result && mysql_num_rows($result) != 0)
{
$infos[] = "--INSERTION NON EFFECTUEE--\\n La plage horaire a déjà été utilisée!";
}
}
// Le code que j'ai ajouter //

if($result && mysql_num_rows($result) != 0)
{
$infos[] = "--INSERTION NON EFFECTUEE--\\n Cette intervention existe déja!";
}
elseif($_POST['hh_dur'] == 0 && $_POST['mm_dur'] == 0)
{
$infos[] = "--INSERTION NON EFFECTUEE--\\n La durée ne peut etre nulle!";
}
else
{
$es = $_POST['attention'] == 'on' ? 'S' : 'A';
$et = $_POST['devoir'] ? $_POST['devoir'] : 'N';
$ecpt = $_POST['et_cpt'] == 'on' ? 'P' : 'N';
$paus = $_POST['pause'] == 'on' ? 'Y' : 'N';
$video = $_POST['video'] == 'on' ? 'Y' : 'N';

//Vérification (de quoi ?)
$chevauchement = "( ( et_debut < sec_to_time( time_to_sec('{$_POST['hh_deb']}:{$_POST['mm_deb']}:00')";
. "+time_to_sec('{$_POST['hh_dur']}:{$_POST['mm_dur']}:00'))";
. "AND sec_to_time(time_to_sec('{$_POST['hh_deb']}:{$_POST['mm_deb']}:00')";
. "+time_to_sec('{$_POST['hh_dur']}:{$_POST['mm_dur']}:00'))";
. " <= sec_to_time(time_to_sec(et_debut)+time_to_sec(et_duree)))"; // fin au milieu
. "OR ( et_debut >= '{$_POST['hh_deb']}:{$_POST['mm_deb']}:00'";
. "AND sec_to_time( time_to_sec('{$_POST['hh_deb']}:{$_POST['mm_deb']}:00')";
. "+time_to_sec('{$_POST['hh_dur']}:{$_POST['mm_dur']}:00'))";
. " >= sec_to_time(time_to_sec(et_debut)+time_to_sec(et_duree)))"; //debut avant et fin apres
. "OR ( et_debut <= '{$_POST['hh_deb']}:{$_POST['mm_deb']}:00'";
. "AND '{$_POST['hh_deb']}:{$_POST['mm_deb']}:00'";
. " < (sec_to_time(time_to_sec(et_debut)+time_to_sec(et_duree))))) "; // debut au milieu

$infos[] = verif_salle(0,$_POST['salle'],$etdate,$chevauchement);
$infos[] = verif_ens(0,$_POST['prof'],$etdate,$chevauchement);
$infos[] = verif_gr(0,$_POST['group'],$etdate,$chevauchement);

// Il faut une pause a 10h et a 16h si pause = Y dans formation et TP ala modif on fera ce qu'on veut
if ($paus=='N')
{
$sql="SELECT pause FROM formation WHERE id_form={$_SESSION['form']}";
$result=mysql_query($sql) or $debug.=$sql;
if($result&&($row=mysql_fetch_array($result))&&($row['pause']=='Y')&&
($_POST['et_ens']=="TP")&&
(
(($_POST['hh_deb']*60+$_POST['mm_deb']<600)&&(($_POST['hh_deb']+$_POST['hh_dur'])*60+$_POST['mm_deb']+$_POST['mm_dur']>600))||
(($_POST['hh_deb']*60+$_POST['mm_deb']<960)&&(($_POST['hh_deb']+$_POST['hh_dur'])*60+$_POST['mm_deb']+$_POST['mm_dur']>960))
)
)
$paus='Y';
}

if (!isset($_POST['et_ens']))
$_POST['et_ens'] = 'TD';

//recup du id_form dans groupe pour mutualisation
$result = do_query('SELECT id_form FROM groupe WHERE id_gr=%s'
, $_POST['group']);
$row = mysql_fetch_array($result);
$form = $row['id_form'];

//INSERTION même si il y a des conflits
$field_values = array
( 'id_mat' => $_POST['mat']
, 'id_sem' => $_SESSION['sem']
, 'id_gr' => $_POST['group']
, 'id_prof' => $_POST['prof']
, 'id_salle' => $_POST['salle']
, 'et_type' => $et
, 'et_ens' => $_POST['et_ens']
, 'et_status' => $es
, 'et_cpt' => $ecpt
, 'et_date' => $etdate
, 'et_debut' => sprintf('%s:%s:00', $_POST['hh_deb'], $_POST['mm_deb'])
, 'et_duree' => sprintf('%s:%s:00', $_POST['hh_dur'], $_POST['mm_dur'])
, 'id_form' => $form
, 'pause' => $paus
, 'divers' => $_POST['divers']
, 'video' => $video;
);

$expr_values = array
( 'date_enreg'
);

$_SESSION['id_et'] = do_query_insert('emptps', $field_values, $expr_fields);

if($video == 'Y')
$infos[] = verif_video(0, $_POST['salle'], $etdate, $chevauchement);

if(!empty($infos))
$infos = "Anomalie(s) détectée(s):<br>" . implode("<br>\n", $infos);
}
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 28/06/2013 à 01:00
Probleme calcul plage horaire
Certes, je suis parfois quelque peu intransigeant, mais c'est parce que sinon je suis trop gentil ;)

j'ai pas envie de me faire lynché par mon tuteur de stage parce-que j'ai rien foutu


Bien venu dans le développement, où tu peux passer une semaine à lire du code sans pouvoir l'améliorer et à devoir expliquer pourquoi.

Ce n'est pas grave si tu ne produit pas de code productif, l'important sera qu'il faudra que tu explique pourquoi et que tu proposes des pistes pour permettre la réécriture du code. Voire même, de proposer d'utiliser un outil éprouvé pour gérer ça. C'est aussi ça notre métier : utiliser l'existant ou l'intégrer.

En fait, parfois le secret c'est de réorganiser le code :
- améliorer le spacing
- remplacer des expressions obscures par des fonctions (avec un nom sémantiquement expressif).

Par exemple, rien qu'en formatant le code, on peut voir une horreur à la ligne 31.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 27/06/2013 à 10:29
Probleme calcul plage horaire
Il n'y a que les crétins qui up.
Les plus atteins up après même pas une journée de publication.
Ceux qui sont à la limite des troubles mentaux le font sur un forum qui a une fréquentation disons, basse.

Le script est dégueulasse. J'espère qu'il n'est pas en production, car n'importe qui peut supprimer l'ensemble des données sans se casser le cul.

1. Le temps, c'est compliqué. Même sans se poser la question des années bissextiles ou les changements d'heure, c'est compliqué de calculer des différences de temps. Donc, tu vas me faire le plaisir de lire la documentation sur la gestion du temps en PHP et en MySQL (tu sauras trouver les manuels sur le Web, j'ose espérer).

2. Fais gaffe à ton orthographe.

3. Quand on fait un commentaire pour décrire l'objectif d'un code, c'est souvent que se morceau de code devrait être une fonction.

4. Le français dans du code, c'est mal. Utilise de l'anglais pour les noms de variable, et commente en anglais.

5. Les abréviation, c'est le mal. « dec » c'est bien pour décembre ?

6. Éviter d'utiliser la concaténation pour construire une requête : ça la rend illisible.

7. Ne pas utiliser directement des valeurs dans la construction d'une requête SQL : il faut s'assurer que la chaîne introduite n'a pas d'effet de bords.
Par exemple :
<?php
$sql_fmt = 'select * from a_full_name_table where id = %s and name = \'%s\';
$sql = sprintf($sql_fmt, mysql_real_escape_string($id), mysql_real_escape_string($name));

Évidement, il y a moyen de faire en sorte que tu n'ais qu'à écrire un appel de fonction en définissant la fonction ad hoc.

8. La clause SQL « between » elle est sympa. Et SQL fournit un tas de fonction de manipulation du temps, qui évite les calculs foireux.

9. Les commentaires inutiles n'ont pas leur place dans du code. « Vérification » ne veut rien dire : vérification de quoi d'ailleurs, que l'âge du capitaine est entre 42 et 69 ?

10. Rigueur : il faut vérifier le retour de toute fonction. mysql_query est un bon exemple de fonction mal contrôlée dans ton code.

Bon, je t'ai donné quelques pistes de travail. En nettoyant ton code, tu le rendras plus lisible, ce qui devrait t'aider à avoir une meilleurs vision d'ensemble du projet.

N'hésite pas à demander de l'aide. Je ne suis pas si méchant que ça :)
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 26/06/2013 à 07:46
checkbox cochée ou pas
N'oublie pas var_dump pour inspecter $_POST.

En ce qui concerne les checkboxes, seules les valeurs cochées doivent être transmise par le client web lors de la soumission du formulaire. C'est donc normal que tu ne reçoive que ce qui est coché.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 19/06/2013 à 00:45
Array
Dans une expression, un opérateur décrit une opération sur des données.

Par exemple, + (binaire) est l'opérateur d'addition. L'opérateur = désigne l'affectation.

[] est l'opérateur d'accès à un élément d'un tableau (ou de tout objet implémentant l'interface ad hoc).

<?php
$a = array(); // création d'un tableau vide
$a[] = 42; // Ajout d'une valeur dans le tableau
$a[] = 1;
var_dump($a);


La var_dump va t'afficher le contenu de $a.

Mais tu devrais aussi lire la documentation de PHP sur les tableaux, in extenso.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 18/06/2013 à 17:41
Array
Est-ce que tu sais ce qu'est un opérateur ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 18/06/2013 à 05:08
Mot de passe perdu
mail, de rien.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 18/06/2013 à 05:07
PHP
Allé, un petit effort : le message d'erreur complet, et on pourra t'aider.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 18/06/2013 à 05:04
PROJET A RENDRE urgent !!!!!!!!
J'espère que tu t'es sorti les doigts du fondement pour le faire, si c'était urgent. On est pas là pour faire tes devoirs.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 18/06/2013 à 05:03
variables de serveur
Le commentaire est pourtant explicite : il se peut que, plutôt que de ne récupérer qu'une seule adresse IP, tu en récupère une liste. Le truc, c'est d'alors récupérer la première adresse de la liste et de la passer à gethostbyaddr.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LoadingChargement en cours