我有一些棘手的代码,也许你有更好的解决方案:
我想要做的是,从数据库中取出最后一个插入条目的“id”(1),然后在它前面加上两个零(001),取当前的“日期”并格式化它(1506)并将所有(1506001)再次插入到我的数据库中的同一行中,进入“orderID”。
$pdo = Database::connect();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql1 = 'SELECT * FROM orders ORDER BY `date` DESC LIMIT 1';
foreach ($pdo->query($sql1) as $row) {
$dateID = date("ym", strtotime($row['date']));
$id = sprintf("%03d", $row['id']);
$orderID = $dateID.$id;
$sql2 = "INSERT INTO orders (orderID) values('$orderID') ";
$q2 = $pdo->prepare($sql2);
$q2->execute();
Database::disconnect();
}
例如:
id date name orderID
==========================
1 1505 John 1505001
2 1505 Jane 1505002
1 1506 Mad 1506001
2 1506 Fred 1506002
现在发生的是,创建了一个新行。 “oderID”的值不存储在同一行中,我不知道如何实现这一点。
答案 0 :(得分:0)
您需要使用UPDATE
代替INSERT
:
$sql2 = "UPDATE `orders` SET `orderID` = '$orderID'
WHERE
`id` = {$row['id']}
AND `date` ='{$row['date']}'
AND `name` = '{$row['name']}'
AND `orderID` ='{$row['orderID']}'
AND `orderID` != '$orderID'";
答案 1 :(得分:0)
我假设在第一次INSERT之后,字段orderID为NULL
因此,您可以运行更新所有记录WHERE orderID IS NULL
的查询。不需要将任何值拉入PHP,MySQL的lpad(),date_format()和concat函数应该可以解决问题。
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
PDO::MYSQL_ATTR_DIRECT_QUERY => false,
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));
setup($pdo);
/* insert new orders */
$stmt = $pdo->prepare('INSERT INTO soFoo (`name`, `date`) VALUES (:name, Now())');
$stmt->bindParam('name', $name);
foreach( array('John', 'Jane', 'Matt', 'Fred') as $name ) {
$stmt->execute();
}
/* 'fix' orderIDs */
$pdo->exec("
UPDATE
soFoo
SET
orderID = concat(
date_format(`date`, '%y%m'),
lpad(`id`, 3, '0')
)
WHERE
orderID IS NULL
");
/* print result */
foreach( $pdo->query('SELECT * FROM soFoo', PDO::FETCH_ASSOC) as $r ) {
echo join(', ', $r), "\r\n";
}
function setup($pdo) {
$pdo->exec('
CREATE TEMPORARY TABLE soFoo (
`id` int auto_increment,
`date` Date,
`name` varchar(32),
`orderID` varchar(32),
primary key(id)
)'
);
}
打印(今天):
1, 2015-06-19, John, 1506001
2, 2015-06-19, Jane, 1506002
3, 2015-06-19, Matt, 1506003
4, 2015-06-19, Fred, 1506004
......但是,如果该表中有一千个订单,那么仍然会留下一个问题。
答案 2 :(得分:0)
您需要做的就是: