2012-01-28 146 views
3

你好老乡程序员,PHP脚本停止

我已经提出,查找数据库,如果登录已经存在,然后返回true或false的功能,这里是这个函数的主体:

public static function loginExiste($login) 
{ 
    $cnx = new GestionBD("localhost", "fnak", "root", ""); 

    $login = mysql_real_escape_string($login); 

    $ret = $cnx->execRequete("SELECT COUNT(*) FROM clients WHERE Client_Login = '".$login."'"); 

    $col = mysql_fetch_array($ret); 
    echo 2; 
    if ($col[0] > 0) 
    { 
     echo 3; 
     return true; 
    } 
    else 
    { 
     echo 4; 
     return false; 
    } 
} 

,这里是我如何调用该函数:

echo 1; 
if (!ExecRequete::loginExiste($_POST['login'])) 
{ 
    echo 5; 
    /* 
    echo '<center><p style="color:red;"> 
       Erreur: Login existe déjà 
      </p></center>'; 
    exit(); 
    */ 
} 
echo 6; 

现在你可以看到,我身边有一些散落echo语句,看看如何execu正在流动。结果我得到的每一次是这样的:

如果登录存在:123 如果它不存在:124

从结果我看到剧本return语句后立即停止执行。通常它应该是这样的:

1236或12456

这个最糟糕的是,考试期间,发生在我身上,这让我很苦恼,因为它没有任何意义可言。调试失去了我很多时间,我无法完成其他容易的部分..

任何人都可以看到为什么这种奇怪的行为发生在这里?

+6

我看不出任何明显错误与您的逻辑,但它可能是PHP发射没有被显示的错误。是否配置了error_reporting和display_errors/log_errors?顺便说一句,关于考试技巧的建议。如果你发现自己陷入某种困境,那就留下来,稍后再回来。如果你得到答案,他们将被标记,如果他们没有按顺序,这并不重要。 – GordonM 2012-01-28 18:17:13

+0

yeh我已经添加了说明:error_reporting(E_ALL); ini_set('display_errors',true);在函数脚本和主函数中。我也把这个函数拿出来放在同一个脚本里,我试着用一个全局变量来输出这个值,但是执行永远不会超出这个函数的范围.. – 2012-01-29 16:25:32

+2

总有[xdebug](http:// xdebug .org /)或[zend debugger](http://static.zend.com/topics/Zend-Debugger-Installation-Guide.pdf)来追踪这样的虚假问题。 – quickshiftin 2012-01-29 18:02:56

回答

2

终于!我哪里出错了^^

重启功能从头开始后(如使用如果($登录==“A”)返回true;)我发现这个问题是在我GestionBD的析构函数类处理与mysql的连接。因为函数中的所有代码除了在return语句的最后都有效。

什么让我确定它是析构函数,是当我把$ cnx = null;之前我的echo 2;并且在回声之前停止执行。然后我注释掉析构函数,并根据需要运行一切。但我不知道什么是错在我的析构函数...

下面是它的样子:

function __destruct() 
{ 
    @mysql_close($this->$connexion); 
} 

现在,如果有人熟悉PHP OOP,他一定会发现错误马上..变量connexion是类中的成员变量。所以当我们用指针$来引用它时,我们需要把它放在没有$的地方(我恨你$,我或者忘记了你,或者当你不需要时:)

正确的析构函数是这样的:

function __destruct() 
{ 
    @mysql_close($this->connexion); 
} 

但这mysql_close功能肯定不是那么好做,它不会给任何错误信息,没有任何例外,它只是崩溃的引擎和叶你想知道为什么..

谢谢大家为你的答案和帮助,这真的很感激:)而且每个人的建议是,如果你得到任何奇怪的行为或错误消息在一个简单的返回true;检查你所有的本地对象的析构函数他们可能有罪,也 USE PDO不使用@与调试时,因为它抑制任何错误的mysql函数;)

+1

您可能希望删除mysql_close上的'@',以便在调试或开发期间不会特别抑制该错误。因为问题不会导致问题的答案,所以对问题的回答是积极的。错误发现在'GestionBD'上,而不是在提供的代码中 – 2012-02-01 18:25:35

+0

现在有道理,我不知道'@',谢谢:) – 2012-02-01 18:36:44