【发布时间】:2019-02-22 16:16:51
【问题描述】:
我需要在 php 中比较来自两种不同类型数据库(MYSQL 和 SQL Server)的表列。
对于背景,我需要比较的表列没有相同的值,所以我首先将它们转换为正确比较,例如 MYSQL 中的值是 BN014,相当于 SQl 服务器中的 BN00000014(只是额外的 4 到 5前两个字符后的零)。我正在使用以下函数进行所需的转换,这部分似乎工作正常:
function convertWR($wr)
{
$mysqli=$this->con;
$wr_number = $wr;
$prod_zeros='';
$p_cat=substr($wr_number,0,2);
$p_num=substr($wr_number,2,strlen($wr_number)-2);
$p_num_len=strlen($p_num);
$ctrl=8;
while ($ctrl>$p_num_len){
$prod_zeros.="0";
$ctrl--;
}
$converted_id=$p_cat.$prod_zeros.$p_num;
return $converted_id;
}
对于比较部分,我将两个数据库的结果分别存储在名为 $wr_from_mssql 和 $wr_from_mysql 的单独数组中,然后使用函数 array_diff() 进行比较:
function compareData()
{
//SQL Server data
$mssql=$this->mssql;
if($mssql)
{
//echo "connected";
if(($result = sqlsrv_query($mssql,"SELECT [ItemId] FROM [dbo].[Item]")) !== false)
{
$count_mssql=1;
$wr_from_mssql=array();
while( $obj = sqlsrv_fetch_array( $result ))
{
$clean_itemid=$string = str_replace(' ', '', $obj['ItemId']);
$wr_from_mssql[]=$clean_itemid;
$count_mssql++;
}
}
}else {
die(print_r(sqlsrv_errors(), true));
}
//-----------------------------------------------------------------------//
//MYSQL data
$mysqli=$this->con;
$count_mysql=1;
$wr_from_mysql=array();
$sql="SELECT WR FROM products";
$result= mysqli_query($mysqli,$sql);
while ($row = mysqli_fetch_array($result)){
//for the required conversion e.g BN014 to BN00000014
$wr= $this->dynacomWR($row['WR']);
$clean_wr=$string = str_replace(' ', '', $wr);
$wr_from_mysql[]=$clean_wr;
$count_mysql++;
}
//----------------------------------------------------------------------//
//To get the difference
$result=array_diff($wr_from_mssql,$wr_from_mysql);
$count_diff=1;
foreach($result as $diff)
{
echo $count_diff.") ".$diff."</br>";
$count_diff++;
}
mysqli_close($mysqli);
$result2=array_diff($result,$wr_from_mysql);
mysqli_close($mysqli);
}
但是我没有得到预期的结果,我仍然得到两个表中存在的 3000 多个值。我期望在获得 10,000++ 的同时获得大约 7000 个结果。
没有空格或常规空格(尽管我仍然尝试删除它们)可能会影响此比较,因为我们在将字符串插入表之前会对其进行清理。
知道可能出了什么问题,还有其他可能的比较方法吗?报告需要它,因此无法使用可用的免费工具。
【问题讨论】:
-
你为什么要在代码中这样做?为什么不直接设置一个链接服务器并在 SQL 中完成工作?
-
嗨 Gordon,因为必须转换 MYSQL 中的值才能匹配 SQL Server 中的对应项,例如 BN014 到 BN00000014。有关更多详细信息,请参阅我的问题的第一个编码部分。但是我从你的建议中得到了一个想法,所以我要创建一个带有转换值的新表,然后将它与链接服务器一起使用
标签: php mysql sql-server oop