Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用默认值准备MySQL INSERT/UPDATE语句_Php_Mysql_Pdo_Prepared Statement_Default Value - Fatal编程技术网

Php 使用默认值准备MySQL INSERT/UPDATE语句

Php 使用默认值准备MySQL INSERT/UPDATE语句,php,mysql,pdo,prepared-statement,default-value,Php,Mysql,Pdo,Prepared Statement,Default Value,引用MySQL插入手册-更新也是如此: 使用关键字DEFAULT将列显式设置为其默认值。这使得编写INSERT语句更加容易,这些语句将值分配给除少数列以外的所有列,因为这样可以避免编写不完整的值列表,而该列表不包含表中每列的值。否则,您必须写出对应于值列表中每个值的列名列表 总之,如果我写 INSERT INTO table1 (column1,column2) values ('value1',DEFAULT); 插入一个新行,将column2设置为其默认值(不管它是什么) 但是,如果我用P

引用MySQL插入手册-更新也是如此:

使用关键字DEFAULT将列显式设置为其默认值。这使得编写INSERT语句更加容易,这些语句将值分配给除少数列以外的所有列,因为这样可以避免编写不完整的值列表,而该列表不包含表中每列的值。否则,您必须写出对应于值列表中每个值的列名列表

总之,如果我写

INSERT INTO table1 (column1,column2) values ('value1',DEFAULT);
插入一个新行,将column2设置为其默认值(不管它是什么)

但是,如果我用PHP编写并执行一条语句:

$statement = $pdoObject->
    prepare("INSERT INTO table1 (column1,column2) values (?,?)");
$statement->execute(array('value1','DEFAULT'));
新行将包含“DEFAULT”作为其文本值-如果该列能够存储文本值

现在我已经为PDO编写了一个抽象层(我需要它),为了解决这个问题,我正在考虑引入一个

const DEFAULT_VALUE = "randomstring";
所以我可以执行如下语句:

$statement->execute(array('value1',mysql::DEFAULT_VALUE));
$stmt = $pdo->prepare("
  INSERT INTO
    foo
    (x,y,z)
  VALUES
    (
      Coalesce(:x, NULLDEFAULT('x', 'foo', 'database')),
      Coalesce(:y, NULLDEFAULT('y', 'foo', 'database')),
      Coalesce(:z, NULLDEFAULT('z', 'foo', 'database'))
    )
");
然后在进行绑定的方法中,我将遍历发送给绑定的值,如果其中一些值等于
self::DEFAULT_VALUE
,则相应地进行操作

我很肯定有更好的办法。其他人遇到过类似情况吗?

尝试更改此选项:

$statement = $pdoObject->
    prepare("INSERT INTO table1 (column1,column2) values (?,?)");
$statement->execute(array('value1','DEFAULT'));
为此:

$statement = $pdoObject->
    prepare("INSERT INTO table1 (column1,column2) values (?,DEFAULT)");
$statement->execute(array('value1'));
在我看来,您的原始代码将提供以下信息:

INSERT INTO table1 (column1,column2) values ('value1','DEFAULT')
INSERT INTO table1 (column1,column2) values ('value1',DEFAULT)
我的代码应该告诉您:

INSERT INTO table1 (column1,column2) values ('value1','DEFAULT')
INSERT INTO table1 (column1,column2) values ('value1',DEFAULT)
我所知道的唯一“解决方法”是使用和

例如

印刷品

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

我试着回答沃尔克的回答,但找不到答案)我对这一切都不熟悉

无论如何,我创建了一个mysql函数,与他的合并思想结合使用

CREATE FUNCTION NULLDEFAULT(colname VARCHAR(64), tablename VARCHAR(64), dbname VARCHAR(64)) RETURNS longtext DETERMINISTIC READS SQL DATA
BEGIN
    DECLARE retval longtext;
    SELECT
        COLUMN_DEFAULT INTO retval 
    FROM
        information_schema.COLUMNS
    WHERE
        TABLE_NAME = tablename
    AND
        COLUMN_NAME = colname
    AND
        TABLE_SCHEMA = dbname;

    RETURN retval;
END
您可以这样使用它:

$statement->execute(array('value1',mysql::DEFAULT_VALUE));
$stmt = $pdo->prepare("
  INSERT INTO
    foo
    (x,y,z)
  VALUES
    (
      Coalesce(:x, NULLDEFAULT('x', 'foo', 'database')),
      Coalesce(:y, NULLDEFAULT('y', 'foo', 'database')),
      Coalesce(:z, NULLDEFAULT('z', 'foo', 'database'))
    )
");
如果列没有默认值,它将返回null,并且不会触发“列没有默认值”错误


当然,您可以修改它,使其不需要数据库参数,我认为它正在写入字符串'DEFAULT',因为它是由pdo转义的,所以有bindvalue的参数,您可以指定给定值的类型,这样您就可以发送一个不带引号的null,它将是pdo::PARAM_null;然后将放入默认值,但我不确定使用execute绑定时是否有类似的参数

  if(is_int($param)){$pdoParam = PDO::PARAM_INT;}
      elseif(is_bool($param)){$pdoParam = PDO::PARAM_BOOL;}
      elseif(is_null($param)){ $pdoParam = PDO::PARAM_NULL;}
      elseif(is_string($param)){$pdoParam = PDO::PARAM_STR;}
                                    else{$pdoParam = FALSE;}
              $this->_query->bindValue($k,$param,$pdoParam);

由于PDO将您的值处理为要输入的字符串,如果可能的话,您可能需要稍微更改代码。您可以更改代码,以便键入
…execute(array(“\'value1\”,'DEFAULT'))
,但我猜PDO正在使用
mysql\u real\u escape\u string()为您处理这些值
,等等。这将破坏该功能。您可能需要直接将其插入
prepare()中
参数。为什么不在您的
INSERT
语句中包含列,说明您正在将其设置为默认值以外的值?问题在于
更新
和提交的空输入。我需要将其设置为默认值,而不是将
'
设置为新值时的日期字段的
0000-00-00
。默认值t(x)可以是默认值,如果您想在同一列中使用此列的默认值,则无需提及列名。这很容易出错。更新t SET x=DEFAULT;很棒的想法!不完美,但比我的解决方案要好!@Frank:当用作Coalesce()的参数时,它必须是默认值(fieldname)。遗憾的是,它给出了一个
一般性错误:1364字段“column1”没有默认值
,如果没有在每一列上设置默认值,您将只在具有默认值的字段上使用
合并(val,default(x))
-thingy。您不能将它扔到那里的任何地方;-)但是,只有当脚本在运行时生成/组装这些(任意)语句,然后您仍然可以使用表信息模式来确定某个字段是否具有默认值时,这才有意义。谁会想要其他值,但不管怎样,都是默认值。我认为这并不能保证性能。AFAIK mysql不会缓存函数的结果,因此您需要为insert查询中的每一行和每一列调用查询。事先通过PHP获取默认值要好得多,但正如我已经总结的那样,我在这里学到的教训是根本不依赖默认的mysql值。根据文档,DETERMINISTIC关键字告诉mysql函数总是返回具有相同参数的相同值,因此我相信它会缓存结果。但是我还没有广泛地体验过它,我在一个小的内部网中使用它,速度没有明显下降应该实现什么?默认值为
PARAM_STR