2013-08-23 155 views
1

我想从我的数据库表“cond”使用该行的ID读取一行。在这种情况下,我只有一行ID = 1。问题是这段代码总是返回$ result是空的。我一直在努力解决它很长一段时间,我试图用PDO或mysqli来做,但我的编码知识非常有限。我怎样才能正确读取行?为什么我的mysql查询总是返回空结果?

这是我的PHP代码:

$response = array(); 
require_once __DIR__ . '/db_connect.php'; 
$db = new DB_CONNECT();  
if (isset($_GET["pid"])) { 
$pid = $_GET['pid']; 
$result = mysql_query("SELECT *FROM cond WHERE id = $pid"); 

if (!empty($result)) { 
    if (mysql_num_rows($result) > 0) { 

     $result = mysql_fetch_array($result); 

     $product = array(); 
     $product["id"] = $result["id"]; 
     $product["name"] = $result["name"]; 
     $product["mon"] = $result["mon"]; 
     $product["tue"] = $result["tue"]; 
     $product["wed"] = $result["wed"]; 
     $product["thu"] = $result["thu"]; 
     $product["fri"] = $result["fri"]; 
     $product["sat"] = $result["sat"]; 
     $product["sun"] = $result["sun"]; 
     $product["version"]=$result["version"]; 

     // success 
     $response["success"] = 1; 

     // user node 
     $response["product"] = array(); 

     array_push($response["product"], $product); 

     // echoing JSON response 
     echo json_encode($response); 
    } else { 
     // no product found 
     $response["success"] = 0; 
     $response["message"] = "No product found. Result=0"; 

     // echo no users JSON 
     echo json_encode($response); 
    } 
} else { 
    // no product found 
    $response["success"] = 0; 
    $response["message"] = "No product found.Result=empty"; 

    // echo no users JSON 
    echo json_encode($response); 
} 
} else { 
// required field is missing 
$response["success"] = 0; 
$response["message"] = "Required field(s) is missing"; 

// echoing JSON response 
echo json_encode($response); 
} 
?> 

这是java代码:

List<NameValuePair> params2 = new ArrayList<NameValuePair>(); 
params2.add(new BasicNameValuePair("pid", "1")); 
JSONObject json = jsonParser.makeHttpRequest(url_product_detials, "GET", params2); 
Log.d("Single Product Details", json.toString()); 

谢谢!

编辑:使用建议PDO

被建议使用PDO我上传下一个代码后:

<?php 

$id=$_POST["pid"]; 


try { 
require_once 'conf.php'; 
$conn = mysqlConnector(); 
$stmt = $conn->prepare('SELECT * FROM cond WHERE id = :id'); 
$stmt->execute(array('id' => $id)); 
$result = $stmt->fetchAll(); 

if (count($result)) { 
foreach($result as $row) { 
    echo json_encode($result); 

}} else { 
echo "No rows returned."; 
} 
} catch(PDOException $e) { 
echo 'ERROR: ' . $e->getMessage(); 
} 
?> 

但现在我得到这个错误:

Error parsing data org.json.JSONException: End of input at character 0 of 
threadid=12: thread exiting with uncaught exception (group=0x40cd7930) 
FATAL EXCEPTION: AsyncTask #1 
java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:299) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.NullPointerException 
at com.goout.ListClubs$GetProductDetails.doInBackground(ListClubs.java:456) 
at com.goout.ListClubs$GetProductDetails.doInBackground(ListClubs.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:287) 
at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
... 4 more 
    Activity com.goout.ListClubs has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{410fb410 V.E..... R......D 0,0-480,144} that was originally added here 
    android.view.WindowLeaked: Activity com.goout.ListClubs has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{410fb410 V.E..... R......D 0,0-480,144} that was originally added here 
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:354) 
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
at android.app.Dialog.show(Dialog.java:281) 
at com.goout.ListClubs$GetProductDetails.onPreExecute(ListClubs.java:435) 
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 
at android.os.AsyncTask.execute(AsyncTask.java:534) 
at com.goout.ListClubs.onCreate(ListClubs.java:87) 
at android.app.Activity.performCreate(Activity.java:5104) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358) 
at android.app.ActivityThread.access$600(ActivityThread.java:153) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5227) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
at dalvik.system.NativeStart.main(Native Method) 

所以我猜测的PHP代码是错误的?

+0

你很容易受到[SQL注入攻击(http://bobby-tables.com)。 –

+0

您可以添加:$查询=“选择*从cond WHERE编号= $ pid”; echo $ query;并发布结果?只是为了确保你的pid是你期望的。 – user2588667

回答

2

空的响应表示查询中存在错误。

除非明确询问,否则Mysql不会告诉您错误是什么。因此,您必须始终检查每个与服务器交互的mysql函数的结果,如果结果为FALSE - 请检查mysql_error()

另外,您正在使用过时的mysql库。退出并开始使用PDO,它有内置的错误报告。

+0

建议我尝试使用PDO。但是现在我有另一个错误 –

+0

这是java异常,介意你。 PHP和java之间有什么界面? –

+0

我修复了php代码,现在可以工作。感谢您的帮助 –

0

你说你的数据库名称是cond。那么你的数据库中的表名是什么? mysql_ *已弃用。请尝试以下

$mysqli = new mysqli("localhost", "username", "password", "cond"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

if ($result = $mysqli->query("SELECT *FROM table_name WHERE id = $pid")) { 

    /* determine number of rows result set */ 
    $row_cnt = $result->num_rows; 

    if ($row_cnt>0) 
    { 
     while ($row = $result->fetch_row()) 
     { 
     $product = array(); 
     $product["id"] = $result["id"]; 
     $product["name"] = $result["name"]; 
     $product["mon"] = $result["mon"]; 
     $product["tue"] = $result["tue"]; 
     $product["wed"] = $result["wed"]; 
     $product["thu"] = $result["thu"]; 
     $product["fri"] = $result["fri"]; 
     $product["sat"] = $result["sat"]; 
     $product["sun"] = $result["sun"]; 
     $product["version"]=$result["version"]; 

     // success 
     $response["success"] = 1; 

     // user node 
     $response["product"] = array(); 

     array_push($response["product"], $product); 

     // echoing JSON response 
     echo json_encode($response); 
    } 
    } 
    else 
    { 
     // no product found 
     $response["success"] = 0; 
     $response["message"] = "No product found. Result=0"; 

     // echo no users JSON 
     echo json_encode($response); 
     /* close result set */ 
    } 
    $result->close(); 
} 

http://php.net/manual/en/mysqli-result.num-rows.php

+0

直接从手册页复制的答案,因此与海报的代码无关,被认为是不好的quaqlity答案。 –

+0

我的意图是指出在查询中使用数据库名称而不是表名,然后建议使用mysqli而不是mysql_ *。然后,我从PHP手册发布如何获取行数与链接,他可以进一步更改的代码是匹配的。但是,尽管如此,我已经为他编写了完全符合他的问题的代码。 –

相关问题