是否存在类似于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变量中。
答案 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
}