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 插入其他更新的主要内容,如果未能解决你的问题,请参考以下文章