我在PHP中开发了一个名为vishwasthali.org的网站,并将其托管在第三方服务器上的 IIS7 中。除了我使用 MySQLi API编写的数据库访问代码之外,其他所有工作都正常。代码在localhost上运行正常,但在服务器上运行不正常。在服务器和我的机器上使用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下载最新的PHP二进制文件来升级服务器上的PHP和MySQLi版本达网络即可。我不想选择第一个选项(这肯定有效),希望你知道为什么。后者不在我手中。除了这些之外别无所求。
我想更换php_mysqli.dll可能会升级mysqli版本,不确定。但是PHP版本呢?
在这种情况下我该怎么办?在服务器上升级PHP和MySQLi版本会解决我的问题吗?如果是,是否会影响服务器上运行的其他PHP网站?
提前致谢。
答案 0 :(得分:7)
好的。这是解决方案。可以在IIS7中启用和并行运行不同的PHP版本。这是我在我的机器上成功测试的程序。考虑到您熟悉IIS和FastCGI,我只是简要介绍了这个过程。如果没有,请参阅链接:http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis'
打开所有文件夹中的 php.ini 文件,添加/取消注释并更改所有文件夹中的以下设置。
session.save_path =“C:\ Windows \ Temp”
expose_php =关闭
;;选择这里的任何路径,但最喜欢的是这个
open_basedir =“C:\ inetpub \ wwwroot”
extension_dir =“ext”
fastcgi.impersonate = 1
cgi.fix_pathinfo = 1
cgi.force_redirect = 0
;;您可以为不同的网站选择不同的时区
date.timezone =“你的时区”
;;启用每个网站所需的任何扩展程序,例如
延长=激活php_mysql.dll
extension = php_mysqli.dll
打开 IIS管理器。添加与要安装的PHP版本数一样多的Handler Mappings。只需在编辑模块映射对话框中更改可执行文件的路径即可。将Mappings命名为便于识别它们,例如 PHP 5.2.14通过FastCGI 和 PHP 5.4.3通过FastCGI 。
在IIS管理器的IIS部分中,打开 FastCGI设置。在这里,检查是否有与要运行的PHP版本数一样多的条目。如果没有,请从右侧窗格中单击添加应用程序。在“添加FastCGI应用程序”对话框的完整路径字段中,从所需PHP版本的文件夹中选择 php-cgi.exe 。单击“确定”。
现在,将您的网站文件夹复制到 C:\ inetpub \ wwwroot 或您在php.ini中的 open_basedir 设置中选择的任何路径。在IIS管理器中,左窗格中的expant Sites-> Default Web Site。选择要定位到特定PHP版本的网站。
打开处理程序映射,从左侧窗格中选择一个网站。你会在这里找到很多映射。仅查看由您创建的条目(路径为 * .php 的条目)。其中,保留所选择的特定网站所需的唯一一个,并删除其他网站。这不会删除您机器上的映射,只会从选定的网站中删除。您的网站现在只能在您保留其映射的PHP版本上运行。对于要定位到特定PHP版本的任何网站,请执行相同的操作。您可以在网站上运行 phpinfo()
对其进行测试。
将新网站添加到 wwwroot 后,它们将不会附加任何处理程序。添加一个新的处理程序,目标是所需的PHP版本。你完成了。
这可能不是最好的程序。但它对我有用。如需验证,请参阅此链接:
http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis/#PHP_Versioning'
希望有所帮助,万一有人需要这个。
此致
答案 1 :(得分:3)
这里有一些错误!
a)您的开发环境与您的实际网站之间的差异太大了!至少使用相同的Web服务器和相同的PHP 5.x 版本!
b)永远不要公开让你的phpinfo()可访问,这是一个非常大的安全风险!黑客可以从中获取大量信息。
c)即使使用预准备语句,您也应该在查询中使用之前清理用户数据!
我不认为您的问题与不同的mysqli版本有任何关系。也许您首先要确保在两个环境中使用相同的Web服务器和php版本,然后再次询问更多代码(例如,如何建立连接),如果它仍然不起作用。
是的,更新PHP会影响服务器上的其他项目,但这只是意味着您需要更新这些项目,无论如何都应该这样做!
不,从php.net下载PHP并不是你的正确方法。您应该使用相应存储库提供的经过测试和批准的版本。