【问题标题】:Can't open geoip.dat file. 'Failed to open stream' even though file exists无法打开 geoip.dat 文件。即使文件存在,“无法打开流”
【发布时间】:2014-07-18 14:05:54
【问题描述】:

我无法理解为什么我被告知文件不存在,什么时候存在。

我的 wordpress 主题中有这样的功能:

function variable($value) {
$country_code = '';
require_once("geoip.inc");
$gi = geoip_open(dirname(FILE)."GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);

我一直在尝试 geoip_open 的不同变体以获取查看文件的代码,但我在前端收到了这个:

(!) 警告:fopen(.geoip.dat): 无法打开流:c:\wamp\www\clairvoyant\wp-content\themes\clairvoyant\geoip.inc 中没有这样的文件或目录在第 314 行

它给出的那条路,是绝对正确的。

我也尝试取出 dirname(FILE) 并只保留文件名,但它显示相同的错误。

我确实在这里阅读了另一篇关于它的帖子,给出了解决方案,因为它需要一个绝对路径,但是我怎样才能在本地机器上做到这一点,它在运行时会同样工作吗? (目前是在 WAMP 环境中)

更新: 这是我的全部功能:

function variable($value) {
$country_code = '';
require_once("geoip.inc");
$gi = geoip_open(dirname(__FILE__)."/GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
switch ($value) {
    case 'prem_no':
        if ($country_code == 'US') { $prem_no = '888-888-8888'; }
        elseif ($country_code == 'AU') { $prem_no = '1900 000 000'; }
        elseif ($country_code == 'GB') { $prem_no = '0906 636 4355'; }
        else { $prem_no  = ''; }
        return $prem_no;
        break;


    case 'prem_rate':
        if ($country_code == 'US') { $prem_rate = '$3.50'; }
        elseif ($country_code == 'AUS') { $prem_rate = '$3.96'; } 
        else { $prem_rate  = '£1.53'; }
        return $prem_rate;
        break;

    case 'local_no':
        if ($country_code == 'US') { $local_no = '755-555-5555'; }
        elseif ($country_code == 'AUS') { $local_no = '1800 000 000'; } 
        else { $local_no  = '0207 111 6311'; }
        return $local_no;
        break;


    case 'sms_no':
        if($country_code == 'AUS') { $sms_no = '1977 1977'; } 
        else { $sms_no  = '78887'; }
        return $sms_no;
        break;

    case 'sms_rate':
        if($country_code == 'AUS') { $sms_rate = '25c'; } 
        else { $sms_rate  = '£1.50'; }
        return $sms_rate;
        break;

    case 'helpline':
        if($country_code == 'US') { $helpline = '700-777-7777'; }
        elseif ($country_code == 'AUS') { $helpline = '1700 000 000'; }
        else { $helpline  = '0207 111 6210'; }
        return $helpline;
        break;

    default:
        break;
}
}

第一个案例包括 GB 作为测试(因为我意识到它对我来说似乎是正确的,因为一切都在经历“其他”)。插入 GB 后,我再次得到空白(以及 echo $country_code 显示空白)。

【问题讨论】:

  • geoip_open 之前使用file_existsFILE 是什么?我以为你想要__FILE__ 就像this
  • 其实用这个$gi = geoip_open("file://C:/wamp/www/clairvoyant/wp-content/themes/clairvoyant/GeoIP.dat",GEOIP_STANDARD);好像是加载了整个页面,看起来也加载了。是否只是上线时重新措辞的情况?
  • dirname(FILE)."GeoIP.dat" needs to be dirname(__FILE__)."/GeoIP.dat"
  • 不要使用file:// 协议,甚至不要使用http。始终使用驱动器上文件的完整路径。
  • 实际上这似乎并没有加载文件,因为虽然页面的其余部分加载了,但当我回显 $country_code 时,我只是得到一个空格

标签: php wordpress geoip


【解决方案1】:

dirname(FILE)."GeoIP.dat" 必须是dirname(__FILE__)."/GeoIP.dat"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2015-12-17
    • 2014-10-21
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多