PasswordHash在CodeIgniter中无法正常工作

3

我已将从http://www.openwall.com/phpass/下载的文件放在application/libraries目录下。

在我的控制器中,我正在使用以下代码-

$params = array(
       'phpass_hash_strength' => 8,
           'phpass_hash_portable' => FALSE
       );
$this->load->library('PasswordHash', $params);
$password = $this->passwordhash->HashPassword($pwd);

我遇到了以下错误 -
A PHP Error was encountered

Severity: Notice

Message: Uninitialized string offset: 3

Filename: libraries/PasswordHash.php

Line Number: 116

A PHP Error was encountered

Severity: Warning

Message: strpos() [function.strpos]: Empty delimiter

Filename: libraries/PasswordHash.php

Line Number: 116

更新

已删除PasswordHash.php,现在使用SimpleLoginSecure


你使用的是哪个操作系统?你的PHP安装中安装了哪些加密算法? - hakre
@hakre 我正在运行win 7...加密,我猜是随着php 5.3.4一起提供的那些。 - Aniket
3
刚遇到了同样的问题,你可能需要将构造函数重命名为__construct()才能在较新的PHP版本中正常工作。 - Xeoncross
@Xeoncross,太棒了。我正在使用Ubuntu 16、PHP-7和CI3,它对我很有效。谢谢你。 - Raham
2个回答

12

在将 PasswordHash 集成到 Symfony2 中时,我遇到了相同的问题。

为了解决这个问题,我将 PasswordHash 方法重命名为 __construct

理论上,如果 PHP 5+ 找不到构造函数,它应该查找与类名称相同的方法 (http://php.net/manual/en/language.oop5.decon.php)。 我猜想是一旦加入命名空间(我的集成要求)后,类名的解析方式发生了变化,但我没有进行任何调查。


当我将一个常规的PHP项目转换为使用Composer并将PHPass移动到命名空间中时,这解决了我的问题。检查密码似乎运行正常,但散列它们却不行。 - Will Warren
1
这个有效了。在更改命名空间后,我遇到了与@wwarren相同的问题,但是遵循您的方法后,问题已解决。谢谢! - DS.
这应该是答案。这个类基于PHP4,所以没有构造方法。 - Richard Testani

2
我认为你的问题是你试图将一个通用的PHP对象用作CodeIgniter库。你不能这样做。你需要修改原始代码使其工作,或者下载一个已经为CodeIgniter设计的贡献库
CodeIgniter库有一些限制(例如它们如何被实例化),所以仅仅将任何文件放入libraries文件夹中是行不通的。

我已经修改了PasswordHash.php文件,使其像一个库文件。它正在加载库,但是函数无法正常工作。 - Aniket
看起来你已经破坏了这个函数。看看你修改后的类中的第116行,那里发生了什么?错误输出中有很多信息,但只有当某人可以访问源代码时才能看到。如果你已经修改了它,我们很难复现。 - OverZealous
我没有修改整个类,我只是改了它的名字。这不会带来太大的影响。 - Aniket
如果你只是改了名字,那么你并没有修改类以适用于CodeIgniter。请查看在CodeIgniter手册中初始化类时传递参数。原始类接受两个参数。 - OverZealous
我放弃了旧的类。现在根据 SimpleLoginSecure.php 进行数据库更改。 - Aniket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接