2011-08-17 2 views
0

Je crée un graphique des temps de forage pour mon projet.PHP + MySQL: le temps comme une chaîne de caractères

Actuellement dans la base de données, il stocke la durée de l'exploration sous forme de champ Heure. Les temps sont récupérés sous la forme MM: SS donc 5 minutes 30 secondes sont exprimées en 05:30 Le paquetage graphique que j'ai choisi (jpgraph) nécessite des valeurs numériques qui lui sont passées sous la forme d'un tableau à graver.

En utilisant le code ci-dessous je reçois ceci:

Array ([0] => 00:03:25 [1] => 00:04:23 [2] => 00:03:48 [3 ] => 00:02:48 [4] => 00:03:09 [5] => 00:02:25)

Je devine comment 00:03:25 est stocké comme une chaîne (aucun moyen de confirmer le type dynamique?).

Ce que je dois probablement est:

A) Exprimé en Minutes décimales:

Array ([0] => 3,417 [1] => 4,383 [2] => 3,800 [3] = > 2,800 [4] => 3,150 [5] => 2,433)

B) exprimée en tant qu'entier secondes:

Array ([0] => 205 [1] => 267 [2] => 228 [3] => 168 [4] => 189 [5] => 145)

Existe-t-il des fonctionnalités existantes qui le font déjà ou dois-je regex loin pour accomplir quelque chose comme ceci puisque la fonction d'idate PHP semble appropriée mais semble seulement retourner un tableau de 0s (voir le code ci-dessous) ...

Quand Je rapportez de SQL, je le fais avec les fonctions suivantes que j'ai fait:

public static function queryDB($aSQLQuery,&$aResult,&$aNumResult){ 
    $aResult = mysql_query($aSQLQuery); 
    $aNumResult = mysql_num_rows($aResult); 
} 

//Returns User aIDNum's 6 most recents attempts of aExcerNum 
public static function getTimes($aIDNum, $aExcerNum, &$aResult,&$aNumResult){ 
    $query = " SELECT * FROM (
        SELECT * 
        FROM Times 
        WHERE uid = ".$aIDNum."  AND 
          exid = ".$aExcerNum." 
        ORDER BY Date DESC 
        LIMIT 6 
       ) AS T1 ORDER BY Date ASC;"; 
    DBHelper::queryDB($query, $aResult, $aNumResult); 
} 

public static function processTimeData($aResult, $aNumResult, &$aArray){ 
    for($i=0; $i<$aNumResult; $i++){ 
     $row = mysql_fetch_array($aResult); 
     $aArray[$i] = DBHelper::txtP($row, 'Date'); 
    } 
    $paddingData = 6 - $aNumResult; 
    for ($j=0; $j < $paddingData; $j++){ 
     $aArray[ ($j+$aNumResult) ] = 0; 
    } 
} 

public static function txtP($aRow, $aString){ 
    return htmlspecialchars(stripslashes($aRow[$aString])); 
} 

Utilisé comme ceci:

DBHelper::getTimes($userID, $excerciseID, $aResult,$aNumResult); 
DBHelper::processTimeData($aResult,$aNumResult,$timeData); 

Ma tentative d'utilisation IDATE() PHP:

public static function processTimeData($aResult, $aNumResult, &$aArray){ 
    for($i=0; $i<$aNumResult; $i++){ 
     $row = mysql_fetch_array($aResult); 
     //Tried "i" (Minutes) and "s" (seconds) 
        $aArray[$i] = iDate("i",$aRow['Time']); 
        //$aArray[$i] = iDate("s",$aRow['Time']); 
    } 
    $paddingData = 6 - $aNumResult; 
    for ($j=0; $j < $paddingData; $j++){ 
     $aArray[ ($j+$aNumResult) ] = 0; 
    } 
} 

résultats dans:

Array ([0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0)

Répondre

0

moi-même trouvé une solution:

Merci à Ragnar pour me aider thi nk de quelque chose!

processTimeData changé comme ci-dessous:

public static function processTimeData($aResult, $aNumResult, &$aArray){ 
    for($i=0; $i<$aNumResult; $i++){ 
     $row = mysql_fetch_array($aResult); 
     $date = new DateTime(DBHelper::txtP($row,'Time')); 
     $aArray[$i] = intval($date->format('s')) + intval($date->format('i'))*60 + intval($date->format('G'))*3600; 
    } 
    $paddingData = 6 - $aNumResult; 
    for ($j=0; $j < $paddingData; $j++){ 
     $aArray[ ($j+$aNumResult) ] = 0; 
    } 
} 
1

Eh bien, vous pouvez convertir en secondes comme ceci:

// "00:03:25" -> 205 
Date("s",strtotime("00:03:25")) + Date("i",strtotime("00:03:25"))*60 + Date("G",strtotime("00:03:25"))*3600; 

EDIT: Ajout strtotime() dans le code

+0

Mettre votre suggestion à savoir (echo Date ("s", "00:03:25") + Date ("i", "00:03:25 ") * 60 + Date (" G "," 00:03:25 ") * 3600;) rendements: 61200. Je l'ai essayé pour toutes les valeurs dans la requête et il renvoie 61200 pour chacun d'eux. Aussi seulement Date ("G", "00:03:25") * 3600 semble apporter quelque chose (17 * 3600) tandis que le reste sont tous les 0. – Zigu

+0

upboated pour inspirer ma solution actuelle! – Zigu

+0

Oui, désolé, j'ai oublié une partie importante. La fonction "strtotime (...)". Je vais mettre à jour le code. – Ragnar

Questions connexes