PHP SQLSRV 插入其他更新

Posted

技术标签:

【中文标题】PHP SQLSRV 插入其他更新【英文标题】:PHP SQLSRV Insert Else Update 【发布时间】:2018-09-12 03:48:03 【问题描述】:

我正在将一个项目从 mysql 迁移到 MS SQL。这与我以前的做法大不相同,因为我是从 1 个 MySQL 表转到 MS SQL 视图和表。我希望我能坚持使用 MySQL,但这是我无法控制的。

我需要插入数据否则更新数据到 sql 表中。这是我的尝试和错误。请帮忙:

$serverName = "myserver";
$connectionInfo = array( "Database"=>"sqldatabasename", "UID"=>"myusername", "PWD"=>"youguysarethebest" );
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) 
 die( print_r( sqlsrv_errors(), true));


$sql = "INSERT INTO CallSettings (Order_Number, ODetail_id, Serial_Id, AssignedPerson, Status, Comments, Customer_IPAddress, customer_assistance_name, customer_assistance_number, customer_assistance_email,networksettings, addressbook, accountcodes, installedprintdrivers) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,     ?, ?) ELSE UPDATE CallSettings SET (Order_Number= (?), ODetail_id= (?), Serial_Id= (?), AssignedPerson= (?), Status= (?), Comments= (?), Customer_IPAddress= (?), customer_assistance_name= (?), customer_assistance_number=(?), customer_assistance_email= (?), networksettings= (?), addressbook= (?), accountcodes= (?),     installedprintdrivers= (?))";

$params = array($Order_Number, $ODetail_id, $Serial_Id, $AssignedPerson, $Status, $Comments,         $Customer_IPAddress, $customer_assistance_name, $customer_assistance_number, $customer_assistance_email,         $networksettings, $addressbook, $accountcodes, $installedprintdrivers);

$stmt = sqlsrv_query( $conn, $sql, $params);
if( $stmt === false ) 
 die( print_r( sqlsrv_errors(), true));

sqlsrv_close($conn);

错误

Array ( [0] => Array ( [0] => 07002 [SQLSTATE] => 07002 [1] => 0 [code] => 0 [2] => [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error [message] => [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error ) )

【问题讨论】:

MySQL to SQL 是你要去mssql 的错误语句,mysql 使用 SQL。我猜sqlsrv_query 每个占位符需要 1 个值。 insert 中的每个占位符都有一个值,但随后似乎对 else 使用相同的值(我还假设 else update 是有效的 mssql,对此并不熟悉)。 如果我只是做一个插入,它工作正常。我需要一个插入其他更新语句。关于php和sqlsrv的帖子不多 手动迁移数据可能更容易(从 MySQL 导出 csv 并导入 SQL Server) 因此您需要增加值的数量...除非 mssql 具有类似 PDO 的仿真,但我不明白它如何知道您将 ? 15 映射到占位符 1 . 我可以从 MySQL 导出 csv 并导入 SQL Server,但这是一个手动过程。 【参考方案1】:

错误消息是因为您传递的参数少于预期(14 而不是 28)。

您需要查询中所有? 标记的参数。您仅传递前 14 个元素的参数(更新部分还有 14 个参数,即使它们与第一部分相同),因此您需要在查询调用中重复参数数组(参数列表的 2 倍) 传递所有值。

$stmt = sqlsrv_query( $conn, $sql, array_merge($params,$params));

【讨论】:

我收到以下错误:Array ([0] => Array ([0] => 42000 [SQLSTATE] => 42000 [1] => 156 [code] => 156 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Server]关键字'ELSE'附近的语法不正确。[消息] => [Microsoft][SQL Server Native Client 11.0][SQL Server]关键字'附近的语法不正确ELSE'.) [1] => Array ([0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft][SQL Server Native Client 11.0] [SQL Server]'(' 附近的语法不正确。[message] => [Microsoft][SQL Server Native Client 11.0][SQL Server]'('.) 附近的语法不正确

以上是关于PHP SQLSRV 插入其他更新的主要内容,如果未能解决你的问题,请参考以下文章

获取最后一个插入 id sqlsrv

将日期时间从 C# 插入到 SqlSrv

PHP 启动:无法加载动态库 'sqlsrv'

php5.6 链接sqlsrv 数据库

SQL Server Driver for PHP之sqlsrv相关函数

致命错误:使用 wamp php 5.5.12 调用未定义函数 sqlsrv_connect()