[英]Migrate PHP code from MySQL to MS SQL Server
I want to migrate a php/mysql script to php/sql-server. 我想将php / mysql脚本迁移到php / sql-server。 The script code isn't mine, I tried to hack it by replacing
mysqli_connect()
with sqlsrv_connect()
, but it's not working. 脚本代码不是我的,我试图通过用
mysqli_connect()
替换mysqli_connect()
来sqlsrv_connect()
进行破解,但是它无法正常工作。
How I can migrate the script? 如何迁移脚本?
the script source code : https://github.com/fixwa/BlackFramework/tree/master/Lib/xcrud 脚本源代码: https : //github.com/fixwa/BlackFramework/tree/master/Lib/xcrud
Below is the database configuration code : 下面是数据库配置代码:
/** Database driver; f0ska xCRUD v.1.6.20; 06/2014 */
class Xcrud_db
{
private static $_instance = array();
private $connect;
public $result;
private $dbhost;
private $dbuser;
private $dbpass;
private $dbname;
private $dbencoding;
private $magic_quotes;
public static function get_instance($params = false)
{
if (is_array($params))
{
list($dbuser, $dbpass, $dbname, $dbhost, $dbencoding) = $params;
$instance_name = sha1($dbuser . $dbpass . $dbname . $dbhost . $dbencoding);
}
else
{
$instance_name = 'db_instance_default';
}
if (!isset(self::$_instance[$instance_name]) or null === self::$_instance[$instance_name])
{
if (!is_array($params))
{
$dbuser = Xcrud_config::$dbuser;
$dbpass = Xcrud_config::$dbpass;
$dbname = Xcrud_config::$dbname;
$dbhost = Xcrud_config::$dbhost;
$dbencoding = Xcrud_config::$dbencoding;
}
self::$_instance[$instance_name] = new self($dbuser, $dbpass, $dbname, $dbhost, $dbencoding);
}
return self::$_instance[$instance_name];
}
private function __construct($dbuser, $dbpass, $dbname, $dbhost, $dbencoding)
{
$this->magic_quotes = get_magic_quotes_runtime();
if (strpos($dbhost, ':') !== false)
{
list($host, $port) = explode(':', $dbhost, 2);
preg_match('/^([0-9]*)([^0-9]*.*)$/', $port, $socks);
$this->connect = mysqli_connect($host, $dbuser, $dbpass, $dbname, $socks[1] ? $socks[1] : null, $socks[2] ? $socks[2] : null);
}
else
$this->connect = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
if (!$this->connect)
$this->error('Connection error. Can not connect to database');
$this->connect->set_charset($dbencoding);
if ($this->connect->error)
$this->error($this->connect->error);
if (Xcrud_config::$db_time_zone)
$this->connect->query('SET time_zone = \'' . Xcrud_config::$db_time_zone . '\'');
}
public function query($query = '')
{
$this->result = $this->connect->query($query, MYSQLI_USE_RESULT);
//echo '<pre>' . $query . '</pre>';
if ($this->connect->error)
$this->error($this->connect->error . '<pre>' . $query . '</pre>');
return $this->connect->affected_rows;
}
public function insert_id()
{
return $this->connect->insert_id;
}
public function result()
{
$out = array();
if ($this->result)
{
while ($obj = $this->result->fetch_assoc())
{
$out[] = $obj;
}
$this->result->free();
}
return $out;
}
public function row()
{
$obj = $this->result->fetch_assoc();
$this->result->free();
return $obj;
}
public function escape($val, $not_qu = false, $type = false, $null = false, $bit = false)
{
if ($type)
{
switch ($type)
{
case 'bool':
if ($bit)
{
return (int)$val ? 'b\'1\'' : 'b\'0\'';
}
return (int)$val ? 1 : ($null ? 'NULL' : 0);
break;
case 'int':
$val = preg_replace('/[^0-9\-]/', '', $val);
if ($val === '')
{
if ($null)
{
return 'NULL';
}
else
{
$val = 0;
}
}
if ($bit)
{
return 'b\'' . $val . '\'';
}
return $val;
break;
case 'float':
if ($val === '')
{
if ($null)
{
return 'NULL';
}
else
{
$val = 0;
}
}
return '\'' . $val . '\'';
break;
default:
if (trim($val) == '')
{
if ($null)
{
return 'NULL';
}
else
{
return '\'\'';
}
}
else
{
if ($type == 'point')
{
$val = preg_replace('[^0-9\.\,\-]', '', $val);
}
//return '\'' . ($this->magic_quotes ? (string )$val : $this->connect->real_escape_string((string )$val)) . '\'';
}
break;
}
}
if ($not_qu)
return $this->magic_quotes ? (string )$val : $this->connect->real_escape_string((string )$val);
return '\'' . ($this->magic_quotes ? (string )$val : $this->connect->real_escape_string((string )$val)) . '\'';
}
public function escape_like($val, $pattern = array('%', '%'))
{
if (is_int($val))
return '\'' . $pattern[0] . (int)$val . $pattern[1] . '\'';
if ($val == '')
{
return '\'\'';
}
else
{
return '\'' . $pattern[0] . ($this->magic_quotes ? (string )$val : $this->connect->real_escape_string((string )$val)) .
$pattern[1] . '\'';
}
}
private function error($text = 'Error!')
{
exit('<div class="xcrud-error" style="position:relative;line-height:1.25;padding:15px;color:#BA0303;margin:10px;border:1px solid #BA0303;border-radius:4px;font-family:Arial,sans-serif;background:#FFB5B5;box-shadow:inset 0 0 80px #E58989;">
<span style="position:absolute;font-size:10px;bottom:3px;right:5px;">xCRUD</span>' . $text . '</div>');
}
}
My hacked code : 我被黑的代码:
private function __construct($dbname, $dbhost, $dbencoding)
私有函数__construct($ dbname,$ dbhost,$ dbencoding)
{ $this->magic_quotes = get_magic_quotes_runtime(); if (strpos($dbhost, ':') !== false) { list($host, $port) = explode(':', $dbhost, 2); preg_match('/^([0-9]*)([^0-9]*.*)$/', $port, $socks); $this->connect = sqlsrv_connect($host,$dbname, $socks[1] ? $socks[1] : null, $socks[2] ? $socks[2] : null); } else $this->connect = sqlsrv_connect($dbhost, $dbname); if (!$this->connect) $this->error('Connection error. Can not connect to database'); $this->connect->set_charset($dbencoding); if ($this->connect->error) $this->error($this->connect->error); if (Xcrud_config::$db_time_zone) $this->connect->query('SET time_zone = \\'' . Xcrud_config::$db_time_zone . '\\''); }
In config file : 在配置文件中:
> // default connection
> public static $dbname = array( "Database"=>"crud1");
> > public static $dbhost = '.\sqlexpress';
You should use PDO, specially if you hope for a better future for your application or website, but you can still use sqlsrv_*
functions if you want. 您应该使用PDO,特别是如果您希望为应用程序或网站创造更好的未来,但是如果愿意,仍然可以使用
sqlsrv_*
函数。 Whatever you do, make sure you replace all function and provide the right parameters. 无论做什么,请确保替换所有功能并提供正确的参数。
Let's see if you want to use SQLSRV Functions (which I don't recommend but I feel this is what you want); 让我们看看是否要使用SQLSRV函数(我不建议这样做,但我觉得这是您想要的); You need to change all
mysqli_*
functions with their sqlsrv_*
counter part, and again, provide the right parameter in the right form: 您需要使用其
sqlsrv_*
计数器部分更改所有mysqli_*
函数,并再次以正确的形式提供正确的参数:
In the constructor, you have: 在构造函数中,您具有:
$this->connect = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
That should be replaced with: 应该替换为:
$this->connect = sqlsrv_connect($dbhost, array( 'Database'=>$dbName, 'UID'=>$dbuser, 'PWD'=>$dbpass));
You see that mysqli_connect
was called with 4 parameters (all strings), but sqlsrv_connect
was called with only 2, (a string and an array). 您可以看到
mysqli_connect
调用了4个参数(所有字符串),但sqlsrv_connect
被称为只有2,(一个字符串数组)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.