php - JSON 对象返回 null (android + json + php + mysql)

标签 php android mysql json rest

我有一份注册表,正在即时进行验证。 用户将焦点从电子邮件字段移开后,我想检查数据库中是否注册了此类电子邮件并对此进行了吐槽。 但无论我做什么,我总是在第 585 行(即以下行)上遇到空指针异常:

Log.d("Checking wether this email exists in database", json.toString());

这是整个事情:

class CheckWetherAUserWithSuchEmailExists extends AsyncTask<String, String, String> {

        int success;

        @Override
        protected String doInBackground(String... args) {

            int success;
            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                Log.d("Kylie", userEmail);
                params.add(new BasicNameValuePair("user_email", userEmail));

                Log.d("request!", "starting");

                // Posting user data to script
                JSONObject json = jsonParser.makeHttpRequest(CHECK_EMAIL_EXISTS_URL, "POST", params);

                // full json response
                Log.d("Checking wether this email exists in database", json.toString());

                // json success element
                success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    Log.d("Email exists", json.toString());
                    finish(); //fire up an alarm
                    userWithTheSameEmail = true;
                    return json.getString(TAG_MESSAGE);
                } else if(success == 2) {
                    Log.d("Email doesnt exist", json.getString(TAG_MESSAGE));
                    userWithTheSameEmail = false;
                    return json.getString(TAG_MESSAGE);
                } else {
                    Log.d("Something happened", json.getString(TAG_MESSAGE));
                    userWithTheSameEmail = false;
                    return json.getString(TAG_MESSAGE);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;

        }

这是接受 json 的 php 脚本:

<?php

//load and connect to MySQL database stuff
require("config.inc.php");



if (!empty($_POST)) {
    //gets user's info based off of a username.

    $user_email = mysql_real_escape_string($_POST['user_email'];
    #$user_email_to_query = "\"". $user_email . "\"";
    $query = " 
            SELECT 
                user_email 
            FROM users 
            WHERE 
                user_email = '$user_email'
        ";

    if (mysql_num_rows($row) > 0) {
        $response["success"] = 1;
        $response["message"] = "User with such email exists";
    } else {
        $response["success"] = 2;
        $response["message"] = "User with such email doesnt exist. You can continue registering";   
    }
} else {
    die("Another brick in the wall");
}

这是配置:

<?php 

    $username = "asd_asd"; 
    $password = "123123"; 
    $host = "localhost"; 
    $dbname = "asd_asd"; 


    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 


    try 
    { 

        $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
    } 
    catch(PDOException $ex) 
    { 

        die("Failed to connect to the database: " . $ex->getMessage()); 
    } 

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 


    if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) 
    { 
        function undo_magic_quotes_gpc(&$array) 
        { 
            foreach($array as &$value) 
            { 
                if(is_array($value)) 
                { 
                    undo_magic_quotes_gpc($value); 
                } 
                else 
                { 
                    $value = stripslashes($value); 
                } 
            } 
        } 

        undo_magic_quotes_gpc($_POST); 
        undo_magic_quotes_gpc($_GET); 
        undo_magic_quotes_gpc($_COOKIE); 
    } 


    header('Content-Type: text/html; charset=utf-8'); 
    session_start();

这是表格:

CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(30) NOT NULL,
  `user_email` varchar(50) NOT NULL,
  `user_password` varchar(100) NOT NULL,
  `user_sex` varchar(10) NOT NULL,
  `user_avatar` varchar(100) DEFAULT NULL,
  `user_date_registered` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `user_last_seen` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `user_points` int(11) NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_name` (`user_name`,`user_email`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

这是错误堆栈跟踪:

 D/Kylie(4458): hdhdu@jfjd.com
 D/request!(4458): starting
Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
 threadid=9: thread exiting with uncaught exception (group=0x4001e578)
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
 Caused by: java.lang.NullPointerException
 net.asdasd.activities.Signup$CheckWetherAUserWithSuchEmailExists.doInBackground(Signup.java:585)
at net.asdasd.activities.Signup$CheckWetherAUserWithSuchEmailExists.doInBackground(Signup.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
... 4 more

如果我应该提供更多信息,我很乐意这样做。

最佳答案

据我所知,PHP 代码中没有任何地方实际执行 json OUTPUT。您生成一个数组,但不对它执行任何操作。

应该有一个

if (!empty($_POST)) {
   ... blah blah blah...
   echo json_encode($response);   // <<---this is missing, apparently
} else {
   echo json_encode('Something blew up');
}

另请注意我如何更改 else 子句以也输出 JSON。如果您期望在远程端使用 JSON,那么您输出的所有内容都应该是 JSON。否则,您将尝试解码不是 json 的内容,最终会出现异常或至少出现未定义的行为。

关于php - JSON 对象返回 null (android + json + php + mysql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19668518/

相关文章:

php - 使用 php 将多个复选框中的值插入到 mysql 数据库中的多行中

php - 如何测试对象是否持久保存在数据库 Symfony/PHPUnit 中

针对 API 28 (Android 9) 时,Android 半透明状态栏始终为灰色且适用于 fitsSystemWindows

php - 如何向表中添加自动增量的行,这将影响我的主键

java - 服务启动时显示的Android通知在创建后立即取消

android全屏模式(ICS),第一次触摸显示导航栏

mysql - 制作一个 SQL 触发器,如果​​它与已存在的行相似,则不会插入该行

mysql - 为什么我的 SQL 查询会使结果翻倍

php - javascript 验证是否足以确保我的表单安全?

javascript - Fittext 不适用于 WordPress 帖子