【问题标题】:Tablegateway "insert" gets executed but no values are written into tableTablegateway“插入”被执行,但没有值写入表
【发布时间】:2019-05-12 23:42:41
【问题描述】:

环境:Docker 容器,PHP 和 MySQL 在单独的容器中运行

我有一个“persons”表,想使用 TableGateway 插入值。代码被执行,我可以捕获最后插入的值。这是一个自动增量,在此表上执行的每次插入都会增加此值。

但表中没有保存任何值(例如电话)

public function __construct(
        ...
        TableGateway $tablePersons,
        ...
    ) {
        ...
        $this->tablePersons = $tablePersons;
        ...
    }

...
$this->tablePersons->insert(['phone' => 123456]);
$id = $this->tablePersons->lastInsertValue;

我打印了 sql 字符串,它看起来很好。

$sql = $this->tablePersons->getSql();
$insert = $sql->insert();
$insert->values(['phone' => 123456]);
print $sql->buildSqlString($insert);

// Result: INSERT INTO `persons` (`phone`) VALUES ('123456')

我在 phpmyadmin 上执行了这个查询,一切看起来都不错,值已存储。

mysql_error.log 为空 mysql.log 显示如下:

2019-05-12T23:34:20.940510Z    34 Connect   root@172.20.0.5 on app using TCP/IP
2019-05-12T23:34:20.940795Z    34 Query SET AUTOCOMMIT=0
2019-05-12T23:34:20.943878Z    34 Query INSERT INTO `persons` (`phone`) VALUES (42)
2019-05-12T23:34:20.944329Z    34 Quit

为了绕过zend-framework,我去了index.php并执行了一个经典的mysqli查询:

$conn = new mysqli(## same values as in the zend-db adapter config ##);
$sql = "INSERT INTO persons (phone) VALUES (123456)";
$conn->query($sql);

这工作得很好 - 一个新的行被存储。所以我认为,可能会排除环境问题。

我需要一个提示,了解当我使用框架函数运行查询时为什么没有保存这些值。

【问题讨论】:

    标签: zend-db


    【解决方案1】:

    尝试确认您已经启动了阻止插入值的 AUTO_COMMIT 的数据库事务。另外,请确认电话和其他字段的字段长度足够大以存储传递的值。

    【讨论】:

    • 我还没有发起交易。但是当我这样做并执行 commit() 函数时,数据集就会被存储。但是你的暗示确实让我走上了正轨。最后,适配器配置中的错误导致值 AUTOCOMMIT 设置为 0。当用本地配置覆盖全局配置时,配置数组中的一级太少了。不幸的是,这并没有导致错误,只是影响了查询的执行。
    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多