【问题标题】:MySQL php array issueMySQL php数组问题
【发布时间】:2011-08-01 04:59:17
【问题描述】:

我正在尝试构建的是来自 php mysql 中的数据库查询的数组。使用 strpos 循环遍历该数组以查找某个字符串。

当注册页面加载时,我包含一个文件,这个文件源如下:

mysql_select_db($database_connBlog, $connBlog);
$query_rsBannedDomains = "SELECT * FROM banned_emailproviders";
$rsBannedDomains = mysql_query($query_rsBannedDomains, $connBlog) or die(mysql_error());
$row_rsBannedDomains = mysql_fetch_assoc($rsBannedDomains);
$totalRows_rsBannedDomains = mysql_num_rows($rsBannedDomains);


$bannedArray = array(); 
    do {
    array_push($bannedArray, $row_rsBannedDomains['domain_emailprovider']);
    }
    while ($row_rsBannedDomains = mysql_fetch_assoc($rsBannedDomains));

//print_r($bannedArray);

$emailaddress = $_POST['email_usr'];

foreach($bannedArray as $key => $domain){
    if(strpos($emailaddress, $domain) == false){
        echo (strpos($emailaddress, $domain));
    } else {
        header ("Location: http://www.disney.com");

    }
}

注册页面提交时,提交给自己。上面源代码的包含,是注册 php 文件中的第二行。第一行是数据库连接的包含。

奇怪的是,有时当我单击返回并重新提交表单时,它会起作用。

【问题讨论】:

  • do...while 不是循环数据库结果的好方法,因为它总是会至少运行一次循环,并且查询可能会返回 0 行。改用while。
  • 太添加到 GordonM 的评论中,您应该删除顶部的 $row_rsBannedDomains = mysql_fetch_assoc($rsBannedDomains); 第一行。此外,array_push() 在这里并不是必需的。看起来您可以在 while 循环中执行 $bannedArray[] = $row_rsBannedDomains['domain_emailprovider'];

标签: php mysql arrays foreach


【解决方案1】:

您不需要加载整个表,然后用 PHP 循环遍历它。事实上,这是一种非常低效的方法。只需查询数据库以查看电子邮件地址的域部分是否是表中的条目之一。

$emailaddress = substr ($_POST['email_usr'], strpos ($emailaddress = $_POST['email_usr'];
, '@'));

$query = "SELECT COUNT(*) AS banned FROM banned_emailproviders WHERE domain_emailprovider = '" . mysql_real_escape_string ($emailaddress) . "'"
if (($res = mysql_query ($query)) && ($row = mysql_fetch_assoc ($res)) && ($row ['banned'] > 0))
{
    // The domain was in the banned list
}
else
if (!$res)
{
    // Something went wrong querying the database
    die (mysql_error ());
}
else
{
    // The domain wasn't in the banned list
}

请注意,上述代码尚未经过测试,因此可能需要进行一些调整才能正常工作。

【讨论】:

  • 感谢您的想法。我使用了这个并且能够完成我所追求的。这里的逻辑很好。
  • 我仍然有一个非常愚蠢的情况,只有在您提交表单时才有效,单击浏览器并再次提交表单。出于某种原因,即使表单正在提交给自己,它也会按顺序运行代码,直到第二次提交,这对我来说毫无意义。
【解决方案2】:

我看到的一件事是

if(strpos($emailaddress, $domain) == false){

应该是

if(strpos($emailaddress, $domain) === false){

http://php.net/manual/en/function.strpos.php

【讨论】:

  • 我确实改变了它,结果相同。某些浏览器在点击返回并重新提交后会捕获标题 if 对已知被禁止电子邮件的声明。
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2011-02-13
  • 2013-03-14
相关资源
最近更新 更多