简体   繁体   English

将PHP代码从MySQL迁移到MS SQL Server

[英]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_*函数,并再次以正确的形式提供正确的参数:

Example

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM