rav*_*ren 15 php mysql pdo prepared-statement default-value
引用MySQL INSERT手册 - 同样适用于UPDATE:
使用关键字DEFAULT将列显式设置为其默认值.这使得编写INSERT语句更容易,这些语句将值分配给除了几列之外的所有列,因为它使您能够避免编写不包含表中每列的值的不完整VALUES列表.否则,您必须写出与VALUES列表中每个值对应的列名列表.
所以简而言之,如果我写
INSERT INTO table1 (column1,column2) values ('value1',DEFAULT);
Run Code Online (Sandbox Code Playgroud)
将插入了将column2设置为其默认值的新行 - 无论它是什么.
但是,如果我在PHP中准备并执行语句:
$statement = $pdoObject->
prepare("INSERT INTO table1 (column1,column2) values (?,?)");
$statement->execute(array('value1','DEFAULT'));
Run Code Online (Sandbox Code Playgroud)
如果列能够存储文本值,则新行将包含"DEFAULT"作为其文本值.
现在我已经为PDO编写了一个抽象层(我需要它)并且考虑引入一个问题来解决这个问题
const DEFAULT_VALUE = "randomstring";
Run Code Online (Sandbox Code Playgroud)
所以我可以执行这样的语句:
$statement->execute(array('value1',mysql::DEFAULT_VALUE));
Run Code Online (Sandbox Code Playgroud)
然后在执行绑定的方法中,我将查看发送到绑定的值,如果某些值相等self::DEFAULT_VALUE,则相应地执行操作.
我很确定有更好的方法来做到这一点.还有其他人遇到类似情况吗?
我知道的唯一"解决方法"是使用Coalesce()和Default(fieldname)
例如
$pdo = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("
CREATE TEMPORARY TABLE foo (
id int auto_increment,
x int NOT NULL DEFAULT 99,
y DATETIME NOT NULL DEFAULT '2010-03-17 01:00:00',
z varchar(64) NOT NULL DEFAULT 'abc',
primary key(id)
)
");
$stmt = $pdo->prepare('
INSERT INTO
foo
(x,y,z)
VALUES
(
Coalesce(:x, Default(x)),
Coalesce(:y, Default(y)),
Coalesce(:z, Default(z))
)
');
$stmt->bindParam(':x', $x);
$stmt->bindParam(':y', $y);
$stmt->bindParam(':z', $z);
$testdata = array(
array(null, null, null),
array(1, null, 'lalala'),
array(null, '2009-12-24 18:00:00', null)
);
foreach($testdata as $row) {
list($x,$y,$z) = $row;
$stmt->execute();
}
unset($stmt);
foreach( $pdo->query('SELECT id,x,y,z FROM foo', PDO::FETCH_NUM) as $row) {
echo join(', ', $row), "\n";
}
Run Code Online (Sandbox Code Playgroud)
版画
1, 99, 2010-03-17 01:00:00, abc
2, 1, 2010-03-17 01:00:00, lalala
3, 99, 2009-12-24 18:00:00, abc
Run Code Online (Sandbox Code Playgroud)