1

重複の可能性:
curl_exec()は常にfalseを返します

こんにちは私はPHPを初めて使用しますが、しばらくの間このことに固執しています。だから私は独自のDBを持つ2つのドメインを持っています。したがって、ユーザーが1つのドメインにログインしようとして、その資格情報がDBに見つからない場合、他のドメインにカールして、その資格情報が存在するかどうかを確認します。したがって、一致とはnum_of_rows = 1、それ以外の場合は0を意味します。

カールが正常に機能した後、すべてをカールすることができますが、見返りに値を取り戻すことはできません。これが私のコードです:-

logincheck.php:

<?php
    session_start();
if(isset($_POST['Email'], $_POST['Password'])){
    $email = $_POST["Email"];   
    $password = $_POST["Password"];

        print "email received $email";
        print "<br>password received $password";

    $db_username="root";
    $db_password="root";
    $database="photobook";
    $localhost = "mysql";

    $con = mysql_connect($localhost,$db_username,$db_password);
    mysql_select_db($database,$con) or die( "Unable to select database");

    $query = "select * from photobook.users where email ='$email' and password ='$password';" ;

    $result = mysql_query($query);

    $num=mysql_num_rows($result);

    if($num == 1){
        while($row = mysql_fetch_array($result))
             {
                $_SESSION['email'] = $row['email'];

                $_SESSION['username'] = $row['username'];   
             }

        header("location: home.php");

    }

    else{

        include "Protocol.php";

                print "<br>email after protocol file include is $email";
                print "<br>password after protocol file include is $password";

        $obj=new Protocol();

        $val = $obj->loginCheck($email,$password);

                **print "<br>value of val received is $val";**

        if($val == 0){
            session_destroy();
                        print "<br>user does not exist";
            header("location: login.php");
        }
        else{
            $_SESSION['email'] = $val[0];
            $_SESSION['username'] = $val[1];
            print "<br>user exists";
            header("location: home.php");

        }   
    }

    mysql_close($con);

    }
?>

最初のドメインのProtocol.php:-

<?php

    class Protocol{   
        function loginCheck($p_email,$p_password){

            $sid = 2;

            $msg="sid=$sid&email=$p_email&password=$p_password";

            print "<br>parameter string sent $msg";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL,"http://www.snapreveal.com/PhotoBook/src/Protocol.php");
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $msg);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            $p_result = curl_exec($ch);
            curl_close($ch);
            if ($p_result === FALSE) {
                  die("Curl error: " . curl_error($ch));
            }
            return $p_result;

        }

    } //end of protocol class
?>

2番目のドメインのProtocol.php:-

<?php

    class Protocol{

        function loginCheckResponse($p_email,$p_password){

            print "<br>inside second domain loginCheckResponse";
            print "<br>email inside second domain loginCheckResponse $p_email";
            print "<br>password inside second domain loginCheckResponse $p_password";

            $db_username="root";
            $db_password="root";
            $database="photobook";
            $localhost = "mysql";

            $con = mysql_connect($localhost,$db_username,$db_password);
            mysql_select_db($database,$con) or die( "Unable to select database");

            $query = "select * from photobook.users where email ='$p_email' and password ='$p_password';" ;

            $result = mysql_query($query);

            $p_num=mysql_num_rows($result);

            print "<br>num found inside teja loginCheckResponse $p_num";

            mysql_close($con);

            if($p_num == 1){
              while($row = mysql_fetch_array($result))
             {

                                $u_email = $row['email'];

                                $u_username = $row['username'];

                                $res = array($u_email,$u_username);
                                print "<br>inside second domain logincheck, after match values in res array are, email $res[0],username $res[1]";
                                print "<br>value in res<br>";
                                print $res;
                                return $res;
             }
            }
            else{
              return 0;
            }

        }

    } //end of protocol class

    $pobj=new Protocol();

    $sid = $_POST['sid'];

    $p_email = $_POST['email'];

    $p_password = $_POST['password'];

    if($_POST['sid'] == 2 ){
        $pobj->loginCheckResponse($p_email,$p_password);

        }
?>

プリントの出力:

email received max@gmail.com
password received max
email after protocol file include is max@gmail.com
password after protocol file include is max
parameter string sent sid=2&email=max@gmail.com&password=max
value of val received is 
inside second domain loginCheckResponse
email inside second domain loginCheckResponse max@gmail.com
password inside second domain loginCheckResponse max
num found inside second domain loginCheckResponse 1
inside second domain logincheck, after match values in res array are, email max@gmail.com,username Max
value in res
Array
user does not exist

したがって、「受け取ったvalの値は」です。この行は、curlが値を返した後に印刷する必要がありますが、その前に印刷します。また、返される価値はありません。なぜ何か考えはありますか?

4

1 に答える 1

3

curlは、失敗するとブール値FALSEを返します。これは、空の文字列として出力されます。リモートサービスを扱うときに成功を想定することは絶対にしないでください。常にエラーをチェックしてください。

    $p_result = curl_exec($ch);
    if ($p_result === FALSE) {
        die("Curl error: " . curl_error($ch));
    }
    curl_close($ch);

===厳密な等式テストの使用に注意してください。これは、実際のブール値のfalseと、自然にfalseに型付けされる結果(空の文字列など)を区別するために必要0です。

于 2012-11-29T19:01:17.113 に答える