用于在mysql中保存用户名字符串的数据类型类似于timestamp

时间:2015-10-21 15:03:00

标签: php mysql

是否存在类似于timestamp的数据类型,但输入可以是任何字符串(例如用户名),只有在行中的另一列已更新时才会更新?这是为了mysql。问题是我的表单有动态生成的行,我需要为已编辑的每一行保存时间戳和用户。在服务器端,我接收所有输入/行,无论它们是否已被更改。

这是处理表单数据的代码的一部分:

if(!empty($_POST)) 
{ 
    $ids=$_POST['ids'];
    $glosas=$_POST['glosas'];
    $monedas=$_POST['monedas'];
    $montos=$_POST['montos'];
    $tipos=$_POST['tipos'];
    $estados=$_POST['estados'];
    $fechas=$_POST['fechas'];
    $codigos=$_POST['codigos'];

    for($i = 0; $i < count($ids); ++$i) {

    // Initial query parameter values 
    $query_params = array( 
        ':id_contrato' => $ids[$i],
        ':glosa' => $glosas[$i],
        ':moneda' => $monedas[$i],
        ':monto' => $montos[$i],
        ':tipo' => $tipos[$i],
        ':estado' => $estados[$i],
        ':fecha' => $fechas[$i],
        ':codigo_externo' => $codigos[$i],

    ); 


    $query = " 
        UPDATE contratos 
        SET 
        glosa = :glosa
        , moneda = :moneda 
        , monto = :monto
        , tipo = :tipo
        , estado = :estado
        , fecha = :fecha
        , codigo_externo = :codigo_externo  
    "; 

    $query .= " 
        WHERE 
            id_contrato = :id_contrato
        "; 

    try 
    { 
        // Execute the query 
        $stmt = $db->prepare($query); 
        $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    { 

        die("No se pudo guardar: " . $ex->getMessage()); 
    } 

    }


    $elim_contratos=$_POST['elim_contratos'];
    //eliminar contratos checkeados
    if(!empty($elim_contratos)){
    foreach($elim_contratos as $elim_contrato)   {

    // Initial query parameter values 
    $query_params = array( 
        ':id_contrato' => $elim_contrato, 
    );

        $query="DELETE FROM contratos WHERE id_contrato = :id_contrato";

        try 
    { 
        // Execute the query 
        $stmt = $db->prepare($query); 
        $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    { 

        die("No se pudo guardar: " . $ex->getMessage()); 
    } 

    }
    }

这是我在mysql或mariaDB中的表结构:

--
-- Table structure for table `contratos`
--

CREATE TABLE IF NOT EXISTS `contratos` (
  `id_contrato` int(10) NOT NULL AUTO_INCREMENT,
  `glosa` varchar(140) NOT NULL,
  `moneda` varchar(10) NOT NULL DEFAULT 'UF',
  `monto` decimal(10,2) NOT NULL,
  `tipo` varchar(50) NOT NULL,
  `estado` varchar(10) NOT NULL,
  `fecha` date NOT NULL,
  `codigo_externo` varchar(50) NOT NULL DEFAULT 'Por Definir',
  `last_save` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `saved_by` varchar(50) NOT NULL,
  PRIMARY KEY (`id_contrato`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1015 ;

用户名保存在$ _SESSION变量中。

1 个答案:

答案 0 :(得分:1)

每次更新/修改行中的任何列时,您都可以更新timestamp字段:

CREATE TABLE myTable (
  timestamp_modified timestamp 
       NOT NULL DEFAULT CURRENT_TIMESTAMP 
       ON UPDATE CURRENT_TIMESTAMP,

  first_name varchar(50), 
  last_name varchar(50)
  ...etc
)
默认情况下,

timestamp_modified将保留创建时间。如果修改了行,则相应地更新时间戳。

更新。根据评论:

  

我需要的是'saved_by'列,以便在何时保存用户名   行中的其他列之一已更新。用户名在   $ _SESSION变量。我想一种方法是检查值   更新之前的数据库相应地更改查询。我只是   想知道我是否可以通过这样做来避免附加选择查询   直接在数据库中。

您可以使用rowCount跳过其他选择。如果没有更新,rowCount将为0.

$stmt = $db->prepare($query); 
$result = $stmt->execute($query_params); 
if ($stmt.rowCount()>0) {
    //update saved_by with the $_SESSION variable
}