Php PDO中的Postgresql插入

Php PDO中的Postgresql插入,php,postgresql,pdo,Php,Postgresql,Pdo,我所有的脚本都是用pdo mysql编写的。现在我正在迁移到posgresql。我陷入了一个插入查询 CREATE TABLE bus_spot ( bus_id integer NOT NULL, spot_loc_id integer NOT NULL, bus_dir_id integer NOT NULL ) 使用php查询 $Bus_Id = 579; $Bus_Dir_Id = 3; $User_Loc_Id = 465; $ISp_Res = $pdo-

我所有的脚本都是用pdo mysql编写的。现在我正在迁移到posgresql。我陷入了一个插入查询

CREATE TABLE bus_spot
(
    bus_id integer NOT NULL,
    spot_loc_id integer NOT NULL,
    bus_dir_id integer NOT NULL
)
使用php查询

$Bus_Id = 579;
$Bus_Dir_Id = 3;
$User_Loc_Id = 465;

$ISp_Res = $pdo->prepare("INSERT INTO bus_spot(bus_id, bus_dir_id, spot_loc_id) VALUES(?, ?, ?)");
$ISp_Res->execute(array($Bus_Id, $Bus_Dir_Id, $User_Loc_Id));
尝试插入此行时出现以下错误

SQLSTATE[22P02]:无效的文本表示法:7错误:整数的输入语法无效:\“\”}


值中有4个占位符

VALUES(?,?,?,?)
但是您的表/数组只有3个

array($Bus_Id,$Bus_Dir_Id,$User_Loc_Id)
删除1个占位符

VALUES(?,?,?)

值中有4个占位符

VALUES(?,?,?,?)
但是您的表/数组只有3个

array($Bus_Id,$Bus_Dir_Id,$User_Loc_Id)
删除1个占位符

VALUES(?,?,?)

在我看来,Postgres似乎对整数的输入格式有点挑剔。请尝试使用适当的类型绑定参数,而不是将其传递给隐式使用字符串的
execute()
方法

$ISp_Res = $pdo->prepare(...);

$ISp_Res->bindParam(1, $Bus_Id, PDO::PARAM_INT);
$ISp_Res->bindParam(2, $Bus_Dir_Id, PDO::PARAM_INT);
$ISp_Res->bindParam(3, $User_Loc_Id, PDO::PARAM_INT);

$ISp_Res->execute();

在我看来,Postgres似乎对整数的输入格式有点挑剔。请尝试使用适当的类型绑定参数,而不是将其传递给隐式使用字符串的
execute()
方法

$ISp_Res = $pdo->prepare(...);

$ISp_Res->bindParam(1, $Bus_Id, PDO::PARAM_INT);
$ISp_Res->bindParam(2, $Bus_Dir_Id, PDO::PARAM_INT);
$ISp_Res->bindParam(3, $User_Loc_Id, PDO::PARAM_INT);

$ISp_Res->execute();

如果该示例是您正在使用的实际代码,那么您的服务器已损坏。:p您的示例在我的VM中运行良好

更有可能的是其中一个“整数”“您传递给的查询正在字符串化为空字符串。常数
null
false
,当然还有
'
,就是这种情况。PostgreSQL对转换的要求比MySQL更严格,如果字符串看起来不像整数,通常会抛出错误,而不是尝试将其转换为整数


查看如果传递
intval($Bus\u Id)
etc而不是按原样传递值,会发生什么情况。如果这样做有效,那么您的值将被破坏,您需要找出原因。

如果该示例是您正在使用的实际代码,那么您的服务器将被破坏:P您的示例在我的虚拟机中运行良好

更有可能的情况是,传递给查询的“整数”之一正在字符串化为空字符串。常数
null
false
,当然还有
'
,就是这种情况。PostgreSQL对转换的要求比MySQL更严格,如果字符串看起来不像整数,通常会抛出错误,而不是尝试将其转换为整数


查看如果传递
intval($Bus\u Id)
etc而不是按原样传递值,会发生什么情况。如果这样做有效,那么您的值将被破坏,您需要找出原因。

我已对其进行了编辑,这是复制时的一个错误。即使删除了1个占位符,我也会遇到同样的错误。我想这不是传递整数的正确方法。我编辑了它,这是复制时的一个错误。即使删除了1个占位符,我也会遇到同样的错误。我想这不是传递整数的正确方法谢谢Phil。。它写道:)。。我又被另一条线卡住了。。这是我用来在PHP中获取最后一个插入id$Ins\U id=$pdo->lastInsertId(
Bus\u Spot\u id
)的代码。。。但是它在postgresql中不起作用。@Dileep:postgresql实际上没有“最后一次插入ID”的概念。(即使是这样,在插入时指定ID也会防止自动创建ID。)但是如果ID字段的类型为
serial
bigserial
,则最可靠的解决方案是使用作为定义序列字段的一部分创建的序列。通过
选择nextval('bus\u spot\u bus\u ID\u seq')
(或非常类似的内容)获取新ID,并在插入
时将其用作ID。(此时您已经有了ID,因此无需询问服务器“上次为我生成的ID是什么?”:)最后,我通过在insert查询中使用“返回总线点ID”获得了insert ID。。谢谢:)谢谢菲尔。。它写道:)。。我又被另一条线卡住了。。这是我用来在PHP中获取最后一个插入id$Ins\U id=$pdo->lastInsertId(
Bus\u Spot\u id
)的代码。。。但是它在postgresql中不起作用。@Dileep:postgresql实际上没有“最后一次插入ID”的概念。(即使是这样,在插入时指定ID也会防止自动创建ID。)但是如果ID字段的类型为
serial
bigserial
,则最可靠的解决方案是使用作为定义序列字段的一部分创建的序列。通过
选择nextval('bus\u spot\u bus\u ID\u seq')
(或非常类似的内容)获取新ID,并在插入
时将其用作ID。(此时您已经有了ID,因此无需询问服务器“上次为我生成的ID是什么?”:)最后,我通过在insert查询中使用“返回总线点ID”获得了insert ID。。谢谢:)谢谢赵。。我用了菲尔的答案wrked@Dileep:然后仔细看看你实际传球的是什么,与你认为自己传球的是什么。如果在这里强制类型“起作用”,那么这可能是偶然的——至少有一个值可能不是您认为的值。谢谢。。我用了菲尔的答案wrked@Dileep:然后仔细看看你实际传球的是什么,与你认为自己传球的是什么。如果在这里强制类型“起作用”,那么这可能是偶然的——至少有一个值可能不是您认为的值。