转换的MSSQL脚本到PHP SQLSRV查询不起作用

时间:2017-03-11 15:11:38

标签: php mysql sql-server mysqli sqlsrv

我确信知识比我更多的人可以提供帮助......

我有一个查询,它将商店sql数据库中的产品与网站mysql数据库进行比较并进行更新。

当我的主机停止支持它时,它必须从php mysql转换为sqlsrv。

我试图转换但不幸的是我已经破解了查询并且它已经停止更新网站mysql数据库。

任何人都可以帮我解决问题或看到任何明显的错误吗?理想情况下,我希望看到它失败的地方,因为sql数据库上的数据是正确的,但是没有在mysql数据库上更新。

任何帮助表示赞赏: - )

使用php mysql和mysql的原始代码

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$Server = "XXXXXX";
$User = "XXXXXX";
$Pass = "XXXXXX";
$DB = "XXXXXX";

//connection to the database
$dbhandle = mssql_connect($Server, $User, $Pass)
  or die("Couldn't connect to SQL Server on $Server. Error: " . mssql_get_last_message()); 

//select a database to work with
$selected = mssql_select_db($DB, $dbhandle)
  or die("Couldn't connect to SQL Server on $Server. Error: " . mssql_get_last_message()); 

//declare the SQL statement that will query the database
$query  = "select I.ID, I.Code Code, H.OnHand / coalesce(StU.UnitSize, 1) OnHand \n";
$query .= "from Products I \n";
$query .= "left join ProductStockLocations St on (St.ProductID = I.ID) \n";
$query .= "left join ProductPOSLocations L on (L.ProductID = I.ID) \n";
$query .= "left join ProductUnits StU on (StU.ID = St.StockUnitID) \n";
$query .= "left join ProductStockOnHandItems H on (H.ProductID = I.ID and H.StockLocationID = St.StockLocationID) \n";
$query .= "where I.ID > 0 \n";
$query .= "and St.StockLocationID = 1 \n";
$query .= "and L.POSLocationID = 1 \n";
$query .= "and L.SoldAtLocation = 1 \n";


// execute the SQL query and return a result set
// mssql_query() actually returns a resource
// that you must iterate with (e.g.) mssql_fetch_array()
$mssqlResult = mssql_query($query);

if($mssqlResult === FALSE) {
    die(mysql_error()); // TODO: better error handling
}

// connect to the MySQL database
mysql_connect("XXXXXX", "XXXXXX", "XXXXXX") or die(mysql_error());
mysql_select_db("XXXXXX") or die(mysql_error());


while ( $mssqlRow = mssql_fetch_array($mssqlResult) ) {
    $mssqlCode = $mssqlRow['Code'];
    $mssqlOnHand = $mssqlRow['OnHand'];
    mysql_query(
        "UPDATE product_option_relation SET stock = $mssqlOnHand WHERE sku = '$mssqlCode'"
       // extra quotes may be required around $mssqlCode depending on the column type
    );
    mysql_query(
        "UPDATE product SET quantity = $mssqlOnHand WHERE sku = '$mssqlCode' AND has_option = '0' ");
    }

//close the connection
mssql_close($dbhandle);

// Update product total with the total quantities of the product options
$result = mysql_query("UPDATE product a INNER JOIN (SELECT product_id, SUM(stock) AS summedqty FROM product_option_relation GROUP BY product_id) b ON b.product_id = a.product_ID SET a.quantity = summedqty")
or die(mysql_error());  
?>

使用sqlsrv和mysqli

的新代码
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$Server = "XXXXXX";
$User = "XXXXXX";
$Pass = "XXXXXX";
$DB = "XXXXXX";

//Connection to the database
$connectionInfo = array( "Database"=>$DB, "UID"=>$User, "PWD"=>$Pass);
@$conn = sqlsrv_connect( $Server, $connectionInfo);

if( $conn === false) {
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}


//declare the SQL statement that will query the database
$query  = "select I.ID, I.Code Code, H.OnHand / coalesce(StU.UnitSize, 1) OnHand \n";
$query .= "from Products I \n";
$query .= "left join ProductStockLocations St on (St.ProductID = I.ID) \n";
$query .= "left join ProductPOSLocations L on (L.ProductID = I.ID) \n";
$query .= "left join ProductUnits StU on (StU.ID = St.StockUnitID) \n";
$query .= "left join ProductStockOnHandItems H on (H.ProductID = I.ID and H.StockLocationID = St.StockLocationID) \n";
$query .= "where I.ID > 0 \n";
$query .= "and St.StockLocationID = 1 \n";
$query .= "and L.POSLocationID = 1 \n";
$query .= "and L.SoldAtLocation = 1 \n";


// execute the SQL query and return a result set
// sqlsrv_query() actually returns a resource
// that you must iterate with (e.g.) sqlsrv_fetch_array()
@$mssqlResult = sqlsrv_query( $conn, $sql);


if( $mssqlResult === false) {
    echo "No result resource after MSSQL query.<br />";
    die( print_r( sqlsrv_errors(), true) );
}


// connect to the MySQL database
@$db = mysqli_connect("XXXXXX", "XXXXXX", "XXXXXX", "XXXXXX");


if (mysqli_connect_error()) {
    echo "Error: Unable to connect to MySQL.<br />";
    exit;
}


while( $mssqlRow = sqlsrv_fetch_array( $mssqlResult, SQLSRV_FETCH_ASSOC) ) {

    $mssqlCode = $mssqlRow['Code'];
    $mssqlOnHand = $mssqlRow['OnHand'];

    $mysqlQuery = "UPDATE product_option_relation SET stock = ".$mssqlOnHand." WHERE sku = '".$mssqlCode."'";

    mysqli_query($db, $mysqlQuery);

    $mysqlQuery = "UPDATE product SET quantity = ".$mssqlOnHand." WHERE sku = '".$mssqlCode."' AND has_option = '0' ";

    mysqli_query($db, $mysqlQuery);
}

//close the MSSRV connections
sqlsrv_free_stmt($mssqlResult);
sqlsrv_close($conn);


// Update product total with the total quantities of the product options
$mysqlQuery = "UPDATE product a INNER JOIN (SELECT product_id, SUM(stock) AS summedqty FROM product_option_relation GROUP BY product_id) b ON b.product_id = a.product_ID SET a.quantity = summedqty";
@$result = mysqli_query($db, $mysqlQuery);
if(!$result){
    echo "No result resource after MySQL query.<br />";
}

//Close MySQL connection
//mysqli_free_result($result);
mysqli_close($db);
?>

1 个答案:

答案 0 :(得分:0)

谢谢你克里斯,一些关于@标志的拼写错误,所以我删除了它们 - 我设法通过改变行来解决问题

@$mssqlResult = sqlsrv_query( $conn, $sql);

阅读

$mssqlResult = sqlsrv_query( $conn, $query);

变量应该读取$ query而不是$ sql。感谢您帮助排除配偶问题。所以完整的查询读取

    <?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$Server = "XXXXXX";
$User = "XXXXXX";
$Pass = "XXXXXX";
$DB = "XXXXXX";

//Connection to the database
$connectionInfo = array( "Database"=>$DB, "UID"=>$User, "PWD"=>$Pass);
$conn = sqlsrv_connect( $Server, $connectionInfo);

if( $conn === false) {
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}


//declare the SQL statement that will query the database
$query  = "select I.ID, I.Code Code, H.OnHand / coalesce(StU.UnitSize, 1) OnHand \n";
$query .= "from Products I \n";
$query .= "left join ProductStockLocations St on (St.ProductID = I.ID) \n";
$query .= "left join ProductPOSLocations L on (L.ProductID = I.ID) \n";
$query .= "left join ProductUnits StU on (StU.ID = St.StockUnitID) \n";
$query .= "left join ProductStockOnHandItems H on (H.ProductID = I.ID and H.StockLocationID = St.StockLocationID) \n";
$query .= "where I.ID > 0 \n";
$query .= "and St.StockLocationID = 1 \n";
$query .= "and L.POSLocationID = 1 \n";
$query .= "and L.SoldAtLocation = 1 \n";


// execute the SQL query and return a result set
// sqlsrv_query() actually returns a resource
// that you must iterate with (e.g.) sqlsrv_fetch_array()
$mssqlResult = sqlsrv_query( $conn, $query);


if( $mssqlResult === false) {
    echo "No result resource after MSSQL query.<br />";
    die( print_r( sqlsrv_errors(), true) );
}


// connect to the MySQL database
$db = mysqli_connect("XXXXXX", "XXXXXX", "XXXXXX", "XXXXXX");


if (mysqli_connect_error()) {
    echo "Error: Unable to connect to MySQL.<br />";
    exit;
}


while( $mssqlRow = sqlsrv_fetch_array( $mssqlResult, SQLSRV_FETCH_ASSOC) ) {

    $mssqlCode = $mssqlRow['Code'];
    $mssqlOnHand = $mssqlRow['OnHand'];

    $mysqlQuery = "UPDATE product_option_relation SET stock = ".$mssqlOnHand." WHERE sku = '".$mssqlCode."'";

    mysqli_query($db, $mysqlQuery);

    $mysqlQuery = "UPDATE product SET quantity = ".$mssqlOnHand." WHERE sku = '".$mssqlCode."' AND has_option = '0' ";

    mysqli_query($db, $mysqlQuery);
}

//close the MSSRV connections
sqlsrv_free_stmt($mssqlResult);
sqlsrv_close($conn);


// Update product total with the total quantities of the product options
$mysqlQuery = "UPDATE product a INNER JOIN (SELECT product_id, SUM(stock) AS summedqty FROM product_option_relation GROUP BY product_id) b ON b.product_id = a.product_ID SET a.quantity = summedqty";
$result = mysqli_query($db, $mysqlQuery);
if(!$result){
    echo "No result resource after MySQL query.<br />";
}

//Close MySQL connection
//mysqli_free_result($result);
mysqli_close($db);
?>