2017-09-22 1 views
2

J'ai une table mysql appelé les messages avec un champ datetime appelé POST_DATE

Voici une capture d'écran de la table de base de données:php mettre à jour les dates dans chaque colonne de table MySQL afin qu'ils incrémentation automatique d'un jour

enter image description here

Je veux mettre la POST_DATE pour la première ligne à la date d'aujourd'hui, puis ajouter un jour à chacun des post_dates après jusqu'à ce qu'ils soient tous mis à jour - donc si aujourd'hui le 22 septembre 2017 et il y a 5 les lignes, les champs post_date seraient:

2017-09-22 12:00:00 
2017-09-23 12:00:00 
2017-09-24 12:00:00 
2017-09-25 12:00:00 
2017-09-26 12:00:00 

Et s'il y a 50 lignes, il avance de 50 jours, etc.

Ma dernière approche est d'obtenir le nombre total de lignes à l'aide mysqli_num_rows() et stocker cette valeur dans une variable.

J'ai essayé d'utiliser date() et mktime() pour créer une « date de début » et « date de fin », puis une boucle foreach pour mettre à jour les dates de cette gamme.

Mais cela ne fonctionne pas. Voici le code:

$servername = "localhost"; 
$username = "user"; 
$password = "password"; 
$dbname = "database_name"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 

// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

//begin if statement to get row count 
if ($result = mysqli_query($conn, "SELECT * FROM Posts")) { 

    /* determine number of rows result set */ 
    $row_cnt = mysqli_num_rows($result); 

    /* close result set */ 
    mysqli_free_result($result); 
} 

//end if statement to get row count 

// create foreach loop with a date range equal to the number of rows, and update the post_date values by one day as many times as there are rows in the table 

    $today = date("Y-m-d"); 
    $begin = new DateTime($today); 
    list($y,$m,$d)=explode('-',$today); 
    $day_last = Date("Y-m-d", mktime(0,0,0,$m,$d+$row_cnt,$y)); 
    $end = new DateTime($day_last); 

    $daterange = new DatePeriod($begin, new DateInterval('P1D'), $end); 

    foreach($daterange as $date) { 

     $sql_date_update = "UPDATE Posts SET post_date = $date->format("Y-m-d h:i:s")"; 

     if ($conn->query($sql_date_update) === TRUE) { 
      echo "Record updated successfully"."<br>"; 
       } else { 
      echo "Error updating record: " . $conn->error; 
      }  
    } 

J'ai essayé tellement d'approches différentes et rien ne fonctionne. Tous les conseils seraient grandement appréciés.

Répondre

0

vous pouvez simplement utiliser des variables SQL en combinaison avec DATE_ADD()

SET @startDate = NOW(); 
SET @days = -1; 
UPDATE Posts SET post_date = DATE_ADD(@startDate, INTERVAL (@days := @days + 1) day) 
+0

Merci M. Ceci est @ Michael un comportement étrange pour moi . J'ai couru cette fois et ça a marché. Mais après cela, il renvoie l'erreur suivante: # MySQL a retourné un ensemble de résultats vide (c'est-à-dire zéro rangée). J'ai essayé puis essayé de supprimer toutes les lignes et en créer de nouvelles, mais en retournant toujours le même résultat. – ramsjared16

+0

J'ai édité ma réponse parce que ce n'était pas exactement ce que vous vouliez archiver –

+0

merci beaucoup, cela a fonctionné parfaitement! Très appréciée! – ramsjared16

2

Vous pouvez essayer d'utiliser une colonne générée ici:

CREATE TABLE Posts (
    id INT NOT NULL AUTO_INCREMENT, 
    post_date DATETIME AS DATE_ADD('2017-09-22', INTERVAL id DAY); 
); 

Cette approche nécessite MySQL 5.7.6 ou plus. Il couple directement une colonne d'incrémentation automatique avec un compteur de date. Je pense qu'il est logique de baser la date générée sur une date initiale fixe. Cela correspond au comportement de la colonne d'incrémentation automatique qui est basée sur zéro.

+0

pour le partage, c'est une déception pour moi que la version mysql sur mon serveur est 5.5.51-38.2 - merci pour l'aide que – ramsjared16

0

Est-ce que vous cherchez? merci

$startDate = date("Y-m-d H:i:s"); 
    $getPostIdArray = array(12,13,14,15,17,16,21); // this should be select query with the needed post ids 
    sort($getPostIdArray); 
    for($i = 0; $i < count($getPostIdArray) ; $i++){ 
     $startDate = date('Y-m-d H:i:s', strtotime('-'.$i.' day', strtotime($startDate))); 
     echo '<pre> Next Date ' . $startDate; 
     //UPDATE SET post_date = ".'".$startDate."`." WHERE id = $getPostIdArray[0] 
    }