【发布时间】:2017-12-06 23:17:29
【问题描述】:
我正在尝试使用 PDO 在 MySQL 数据库中插入一行,并且我正在使用参数绑定,但我遇到了一个奇怪的错误。重要的功能是:
private static function getConnection() : \Pdo
{
$con = new \PDO('mysql:host=localhost;dbname=mydatabase;charset=utf8', 'myuser', 'mypassword');
return $con;
}
public static function runBool(string $query, ?array $bind = []) : bool
{
return self::getConnection()
->prepare($query)
->execute($bind);
}
如您所见,getConnection() 仅返回一个连接(并且工作正常),问题在于函数runBool() 在->execute($bind); 行上引发错误:
例外:参数 'index' 必须是 int
比如我的$query是
插入客户端(company_id、name、phone、cpf、rg、city_id、address、obs)值(:company_id、:name、:phone、:cpf、:rg、:city_id、:address、:obs)
我的$bind 是
array(8) {
["company_id"]=> int(1)
["name"]=> string(3) "John Doe"
["phone"]=> string(11) "123456789"
["cpf"]=> string(0) ""
["rg"]=> string(0) ""
["city_id"]=> int(79)
["address"]=> string(0) ""
["obs"]=> string(0) ""
}
我已经尝试 foreach $bind 并单独使用 bindParam() 或 bindValue(),然后运行 execute 但我在 execute() 上遇到相同的错误。
我已经在数组的每个键之前包含: 并将其删除(在this comment 之后),但没有任何变化。
我已经在 Google 上搜索了很多,但似乎没有人遇到相同类型的问题。
信息:
- PHP 7.1.12
- Ubuntu 16.04.03
- MySQL 5.7.20
- 流浪者 2.0.0
感谢每一个帮助。
---------------- 编辑 ----------------
如被问及,我检查了我的命名空间,但我使用的是 \Pdo,所以我认为它是原生 PHP PDO 类。这是self::getConnection()->prepare($query) 的var_dump:
object(PDOStatement)#90 (1) { ["queryString"]=> string(149) "INSERT INTO client (company_id, name, phone, cpf, rg, city_id, address, obs) VALUES (:company_id, :name, :phone, :cpf, :rg, :city_id, :address, :obs)" }
这是我的桌子:
CREATE TABLE `client` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(50) NOT NULL,
`phone` varchar(15) NOT NULL,
`city_id` int(10) UNSIGNED NOT NULL,
`address` varchar(100) DEFAULT NULL,
`cpf` varchar(14) DEFAULT NULL,
`rg` varchar(15) DEFAULT NULL,
`obs` varchar(100) DEFAULT NULL,
`company_id` int(10) UNSIGNED NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `client`
ADD PRIMARY KEY (`id`),
ADD KEY `city_id` (`city_id`),
ADD KEY `company_id` (`company_id`);
ALTER TABLE `client` ADD FULLTEXT KEY `search` (`name`,`phone`,`address`,`cpf`,`rg`,`obs`);
ALTER TABLE `client` ADD FULLTEXT KEY `search_basic` (`name`);
ALTER TABLE `client`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=613;
ALTER TABLE `client`
ADD CONSTRAINT `client-city_id` FOREIGN KEY (`city_id`) REFERENCES `city` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
ADD CONSTRAINT `client-company_id` FOREIGN KEY (`company_id`) REFERENCES `company` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
【问题讨论】:
-
听起来该结构包含一个名为
index的字段,该字段被标记为键或唯一。虽然在 mysql 中将字段索引命名为关键字很奇怪 -
本题与PDO无关,故去掉标签
-
哪种结构?没有列、表、变量或任何所谓的“索引”。
-
我认为这与 PDO 相关,因为它发生在 PDOStatement::execute() 函数中。