8

我用 PHP开发了一个名为vishwasthali.org的网站,并将其托管在第三方服务器上的IIS7中。除了我使用MySQLi API编写的数据库访问代码外,其他一切都很好。该代码在本地主机上运行良好,但在服务器上却不行。在服务器和我的机器上使用phpinfo(),我发现:

(1) 在我的机器上(运行在 Windows 7 32 位,Apache 主机环境),PHP 版本是5.3.8,mysqli 版本是5.0.8-dev,并且

(2)服务器端(运行Windows Server 2008,IIS7宿主环境),PHP版本为5.2.14,mysqli版本为5.0.51a


以下是服务器上的截图phpinfo()在此处输入图像描述 在此处输入图像描述


这是mysqli代码的示例。

session_start();
include_once 'code_files/conn.php';
$stmt = $mysqli->prepare('SELECT * FROM adminusers WHERE Username = ? AND `Password` = ?');
$stmt->bind_param('ss', $_POST['Username'], $_POST['Password']);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows > 0)
    ........
else
    ........

使用echo get_class($mysqli);确实显示mysqli。这意味着,代码确实检测到了 mysqli。但声明$stmt没有准备好。即使$mysqli->error;没有显示任何错误,也可能是因为 PHP 在 IIS 上运行。

现在我有两个选择,要么将数据库访问代码更改为经典的mysql API,要么通过从php.net下载最新的 PHP 二进制文件来升级服务器上的 PHP 和 MySQLi 版本。我不喜欢第一个选项(这绝对有效),希望你知道为什么。后者不在我手中。想不到这些了。

我想更换 php_mysqli.dll 可能会升级 mysqli 版本,不确定。但是PHP版本呢?

在这种情况下我能做什么。服务器上的 PHP 和 MySQLi 版本升级会解决我的问题吗?如果是,是否会影响服务器上运行的其他 PHP 网站?

提前致谢。

4

2 回答 2

7

好的。这是解决方案。可以在 IIS7 中启用和并行运行不同的 PHP 版本。这是我在我的机器上成功测试的过程。考虑到您熟悉 IIS 和 FastCGI,我只是简要介绍了该过程。如果没有,请查看链接:http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis'

  1. 从http://www.php.net/downloads.php下载任何不同版本的带有 PHP 二进制文件的非线程安全 zip 包。
  2. 将它们提取到硬盘中的单独文件夹中,例如C:\PHP5.2.14C:\PHP5.4.3等。
  3. 打开所有文件夹中的php.ini文件并添加/取消注释并更改所有文件夹中的以下设置。

    session.save_path = "C:\Windows\Temp"
    expose_php = Off
    ;; 在这里选择任何路径,但最喜欢的是这个
    open_basedir = "C:\inetpub\wwwroot"
    extension_dir = "ext"
    fastcgi.impersonate = 1
    cgi.fix_pathinfo=1
    cgi.force_redirect = 0
    ;; 您可以为不同的网站选择不同的时区
    date.timezone = "you time zone"
    ;; 启用您希望每个网站的任何扩展,例如
    extension=php_mysql.dll
    extension=php_mysqli.dll

  4. 打开IIS 管理器。添加与要安装的 PHP 版本数一样多的处理程序映射。只需在Edit Module Mapping对话框中更改Executable的路径。将映射命名为方便识别它们,例如通过 FastCGI 的PHP 5.2.14 和通过 FastCGIPHP 5.4.3

  5. 在 IIS 管理器的 IIS 部分中,打开FastCGI Settings。在这里,检查是否有与您要运行的 PHP 版本数一样多的条目。如果没有,请单击右窗格中的添加应用程序。在“添加 FastCGI 应用程序”对话框的完整路径字段中,从所需 PHP 版本的文件夹中选择一个php-cgi.exe 。单击确定。

  6. 现在,将您的网站文件夹复制到C:\inetpub\wwwroot或您在 php.ini的open_basedir设置中选择的任何路径。在 IIS 管理器中,从左窗格展开站点-> 默认网站。选择要定位到特定 PHP 版本的网站。

  7. 打开Handler Mapping,从左侧窗格中选择一个网站。你会在这里找到很多映射。仅查找您创建的条目(路径为*.php的条目)。其中,保留所选特定网站所需的唯一一个并删除其他。这不会从您的机器上删除映射,而只会从所选的网站中删除。您的网站现在将仅在您保留其映射的 PHP 版本上运行。对您想要定位到特定 PHP 版本的任何网站执行相同的操作。phpinfo()您可以通过在网站上运行来测试它。

将新网站添加到wwwroot后,它们不会附加任何处理程序。添加一个针对所需 PHP 版本的新处理程序。你完成了。

这可能不是最好的程序。但它对我有用。如需验证,请参阅此链接:
http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis/#PHP_Versioning'

希望它有所帮助,以防有人需要。

问候

于 2012-06-04T14:51:12.113 回答
3

这里有几件事很不对劲!

a) 你的开发环境和你的现场的差别太大了!至少使用相同的 Web 服务器和相同的 PHP 5.x版本!

b) 永远不要公开让您的 phpinfo() 可访问,这是一个非常大的安全风险!黑客可以从中获取大量重要信息。

c) 即使使用准备好的语句,您也应该在查询中使用用户数据之前对其进行清理!

我认为您的问题与不同的 mysqli 版本无关。也许您应该首先确保在两个环境中使用相同的 Web 服务器和 php 版本,然后再次询问更多代码(例如,您如何建立连接)是否仍然无法正常工作。

是的,更新 PHP 会影响服务器上的其他项目,但这只是意味着您需要更新这些项目,无论如何您都应该这样做!

不,从 php.net 下载 PHP 在您的情况下不是正确的方法。您应该使用各自存储库提供的经过测试和批准的版本。

于 2012-06-03T17:17:40.130 回答