【问题标题】:Currently selected database in SQL ServerSQL Server 中当前选择的数据库
【发布时间】:2010-07-23 09:22:50
【问题描述】:

我目前的任务是将我们的网站代码移植到 linux 服务器上(来自 Win2003)。这些网站在 SQL Server 数据库上运行。最初的开发者创建了一个包装器来包含与数据库的所有交互,包括选择正确的数据库(应用程序跨越多个数据库) 问题代码如下...

if (strcmp($this->_DB_Connection, $param_Database) <> 0) {
  $this->_DB_Selected = @mssql_select_db($param_Database, $this->_DB_Connection);
}

其中 $this->_DB_Connection 是与 DB 服务器的连接,$param_Database 是下一次查询所需的数据库名称。

问题是,在 Windows 上,strcmp 返回 1,在 linux 上返回 NULL

任何人都可以解决这个问题,每次都需要选择数据库。

【问题讨论】:

    标签: php sql-server linux


    【解决方案1】:

    您的连接失败并且_DB_Connection 为空,或者$param_Database 变量为空。

    【讨论】:

    • 两者都不是。 _DB_Connection 持有一个有效的资源标识符,$param_Database 持有一个字符串
    【解决方案2】:

    我最终只是将最后选择的数据库的名称存储在 DB 包装器对象的成员变量中,并且正在比较它而不是 SQL 连接

    【讨论】:

      【解决方案3】:

      这是您复制和粘贴的实际“真实”代码还是您在此处键入的?

      mssql_select_db() 的第二个参数是数据库链接,它是一个资源。 IE。 $this-&gt;_DB_Connection 要么是资源,要么 @mssql_select_db($param_Database, $this-&gt;_DB_Connection); 将始终失败。
      如果$this-&gt;_DB_Connection 是资源,那么您将resource 传递给strcmp($this-&gt;_DB_Connection, $param_Database),然后隐式转换为字符串将类似于resource #3。因此,除非您的数据库被称为resource #3,否则您的 strcmp() 将始终失败。

      根据您提供的代码,选择两个函数中的哪一个总是失败。

      为了使这种方法有效,将当前选择的数据库的名称存储在对象的属性中并使用它进行比较。

        protected $_Current_Database = null;
      
        [...]  
      
          if ( 0!==strcmp($this->_Current_Database, $param_Database) ) {
            $this->_DB_Selected = @mssql_select_db($param_Database, $this->_DB_Connection);
            if ( $this->_DB_Selected ) {
              $this->_Current_Database = $param_Database;
            }
            else { // select_db failed.
              $msg = mssql_get_last_message();
              // do something with $msg here, e.g. echo 'mssql message: ', $msg;
            }
          }  
        [...]
      

      【讨论】:

      • 是的,这是实际的代码(请注意,我没有写这个)。 $this->_DB_Connection 是一个有效的资源标识符。如果我删除 if 语句,mssql_select_db 就可以工作。同意,我预计 strcmp 会失败(就像在 linux 主机下一样),但它会在 Windows 中通过。我不喜欢这段代码,将资源与字符串进行二进制比较是不好的,因此我要求更好的解决方案
      • @michael:要相信这段代码可以在 Windows 机器上运行,需要比我更相信魔法 ;-) 你是如何测试它的?使用像 xdebug 这样的调试器?一些 var_dump/echo 行?
      • 我真的不需要你相信它有效,这不是这个问题的重点,我需要一个替代方案。
      • 安装像xdebug这样的调试器,在strcmp()行设置断点,自己看看。
      猜你喜欢
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多