使用 where 子句检索 MySQL 数据
Retrieve MySQL data using where clauses
我想知道如何使用 WHERE
子句从 MySQL
获取数据并最终加载到 android listView
?我想根据名称和月份获取 date、timeIn 和 timeOut。这是我到目前为止尝试过的。
获取数据
public void getData(String name, String month) {
class GetDataJSON extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost("http://192.168.1.7/Android/CRUD/retrieveInformation.php");
// Depends on your web service
httppost.setHeader("Content-type", "application/json");
InputStream inputStream = null;
String result = null;
try {
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
// json is UTF-8 by default
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
result = sb.toString();
} catch (Exception e) {
// Oops
}
finally {
try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}
return result;
}
@Override
protected void onPostExecute(String result){
myJSON=result;
showList();
}
}
GetDataJSON g = new GetDataJSON();
g.execute();
}
protected void showList(){
try {
JSONObject jsonObj = new JSONObject(myJSON);
information = jsonObj.getJSONArray(Config.TAG_RESULTS);
for(int i=0;i<information.length();i++){
JSONObject c = information.getJSONObject(i);
String date = c.getString(Config.TAG_DATE);
String timeIn = c.getString(Config.TAG_TiME_IN);
String timeOut = c.getString(Config.TAG_TIME_OUT);
HashMap<String,String> info = new HashMap<String,String>();
info.put(Config.TAG_DATE, date);
info.put(Config.TAG_TiME_IN, timeIn);
info.put(Config.TAG_TIME_OUT,timeOut);
infoList.add(info);
}
ListAdapter adapter = new SimpleAdapter(
HomePage.this, infoList, R.layout.retrieve_data,
new String[]{Config.TAG_DATE,Config.TAG_TiME_IN,Config.TAG_TIME_OUT},
new int[]{R.id.date,R.id.timeIn,R.id.timeOut}
);
listView.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
retrieveInformation.php
<?php
define('HOST','127.0.0.1:3307');
define('USER','root');
define('PASS','');
define('DB','androiddb');
$con = mysqli_connect(HOST,USER,PASS,DB) or die('unable to connect');
$name = $_GET['name'];
$month = $_GET['month'];
$sql = "select * from information WHERE name= '". $name."' and month = '".$month."'";
$res = mysqli_query($con,$sql);
$result=array();
while($row=mysqli_fetch_array($res)){
array_push($result,array('id'=>$row[0],'name'=>$row[1],'weather'=>$row[2],'date'=>$row[3],'status'=>$row[4],
'time_in'=>$row[5], 'time_out'=>$row[6]));
}
echo (json_encode(array("result"=>$result)));
mysqli_close($con);
?>
我可以通过以下方式将 MySQL
中的所有数据检索到 android listView
使用我在 GetData 中发布的代码。现在我怎样才能找回
基于名称和月份的数据?我找不到任何教程
google...
您没有在 HTTP 请求中输入名称和月份。
试试这个
HttpPost httppost = new HttpPost("http://192.168.1.7/Android/CRUD/retrieveInformation.php?name="+name+"&month="+month);
希望对您有所帮助:)
您似乎想将 name/month 作为参数传递给您的 PHP 文件。
最简单的方法是在 URL 字符串中传递参数(最简单的方法):
HttpPost httppost = new HttpPost('http://192.168.1.7/Android/CRUD/retrieveInformation.php?name=SomeName&month=SomeMonth')
然后,名称和月份将被视为您在 PHP 文件中的 $_GET 变量。
但是,因为您希望您的代码被正确编码,所以您可以改为执行以下操作:
URI uri = new URIBuilder()
.setScheme("http")
.setHost("192.168.1.7")
.setPath("/Android/CRUD/retrieveInformation.php")
.addParameter("name", name)
.addParameter("month", month)
.build();
HttpGet httpget = new HttpGet( uri );
请注意,我在第二个示例中使用的是 HttpGet
而不是 HttpPost
关于您的 PHP 代码的快速建议,这样您就不必将所有索引重新映射到它们的键名:
while($row=mysqli_fetch_assoc($res)){
$result[] = $row;
}
mysqli_fetch_assoc 会将数组的键设置为列名。这将发送所有列。如果您不想发送所有列而只发送 7 列,则应将 select 查询修改为:
$sql = "select id, name, weather, date, status, time_in, time_out from information WHERE name= '". $name."' and month = '".$month."'";
并且,还要在您的 select 查询之前清理 $name 和 $month:
$name = mysqli_escape_string($name);
$month = mysqli_escape_string($month);
这是您的代码更新以反映修改:
<?php
define('HOST','127.0.0.1:3307');
define('USER','root');
define('PASS','');
define('DB','androiddb');
$con = mysqli_connect(HOST,USER,PASS,DB) or die('unable to connect');
$name = $_GET['name'];
$month = $_GET['month'];
$months = [
'January' => '01',
'February' => '02',
'March' => '03',
'April' => '04',
'May' => '05',
'June' => '06',
'July' => '07',
'August' => '08',
'September' => '09',
'October' => '10',
'November' => '11',
'December' => '12',
];
if (!isset($months[ $month ])) {
die("Invalid month");
}
$month = $months[ $month ];
$name = mysqli_escape_string($con, $name);
$month = mysqli_escape_string($con, $month);
$sql = "select * from information WHERE name= '". $name."' and month = '".$month."'";
$res = mysqli_query($con,$sql);
$result=array();
while($row=mysqli_fetch_assoc($res)){
$result[] = $row;
}
echo (json_encode(array("result"=>$result)));
mysqli_close($con);
?>
我想知道如何使用 WHERE
子句从 MySQL
获取数据并最终加载到 android listView
?我想根据名称和月份获取 date、timeIn 和 timeOut。这是我到目前为止尝试过的。
获取数据
public void getData(String name, String month) {
class GetDataJSON extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost("http://192.168.1.7/Android/CRUD/retrieveInformation.php");
// Depends on your web service
httppost.setHeader("Content-type", "application/json");
InputStream inputStream = null;
String result = null;
try {
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
// json is UTF-8 by default
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
result = sb.toString();
} catch (Exception e) {
// Oops
}
finally {
try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}
return result;
}
@Override
protected void onPostExecute(String result){
myJSON=result;
showList();
}
}
GetDataJSON g = new GetDataJSON();
g.execute();
}
protected void showList(){
try {
JSONObject jsonObj = new JSONObject(myJSON);
information = jsonObj.getJSONArray(Config.TAG_RESULTS);
for(int i=0;i<information.length();i++){
JSONObject c = information.getJSONObject(i);
String date = c.getString(Config.TAG_DATE);
String timeIn = c.getString(Config.TAG_TiME_IN);
String timeOut = c.getString(Config.TAG_TIME_OUT);
HashMap<String,String> info = new HashMap<String,String>();
info.put(Config.TAG_DATE, date);
info.put(Config.TAG_TiME_IN, timeIn);
info.put(Config.TAG_TIME_OUT,timeOut);
infoList.add(info);
}
ListAdapter adapter = new SimpleAdapter(
HomePage.this, infoList, R.layout.retrieve_data,
new String[]{Config.TAG_DATE,Config.TAG_TiME_IN,Config.TAG_TIME_OUT},
new int[]{R.id.date,R.id.timeIn,R.id.timeOut}
);
listView.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
retrieveInformation.php
<?php
define('HOST','127.0.0.1:3307');
define('USER','root');
define('PASS','');
define('DB','androiddb');
$con = mysqli_connect(HOST,USER,PASS,DB) or die('unable to connect');
$name = $_GET['name'];
$month = $_GET['month'];
$sql = "select * from information WHERE name= '". $name."' and month = '".$month."'";
$res = mysqli_query($con,$sql);
$result=array();
while($row=mysqli_fetch_array($res)){
array_push($result,array('id'=>$row[0],'name'=>$row[1],'weather'=>$row[2],'date'=>$row[3],'status'=>$row[4],
'time_in'=>$row[5], 'time_out'=>$row[6]));
}
echo (json_encode(array("result"=>$result)));
mysqli_close($con);
?>
我可以通过以下方式将 MySQL
中的所有数据检索到 android listView
使用我在 GetData 中发布的代码。现在我怎样才能找回
基于名称和月份的数据?我找不到任何教程
google...
您没有在 HTTP 请求中输入名称和月份。
试试这个
HttpPost httppost = new HttpPost("http://192.168.1.7/Android/CRUD/retrieveInformation.php?name="+name+"&month="+month);
希望对您有所帮助:)
您似乎想将 name/month 作为参数传递给您的 PHP 文件。 最简单的方法是在 URL 字符串中传递参数(最简单的方法):
HttpPost httppost = new HttpPost('http://192.168.1.7/Android/CRUD/retrieveInformation.php?name=SomeName&month=SomeMonth')
然后,名称和月份将被视为您在 PHP 文件中的 $_GET 变量。
但是,因为您希望您的代码被正确编码,所以您可以改为执行以下操作:
URI uri = new URIBuilder()
.setScheme("http")
.setHost("192.168.1.7")
.setPath("/Android/CRUD/retrieveInformation.php")
.addParameter("name", name)
.addParameter("month", month)
.build();
HttpGet httpget = new HttpGet( uri );
请注意,我在第二个示例中使用的是 HttpGet
而不是 HttpPost
关于您的 PHP 代码的快速建议,这样您就不必将所有索引重新映射到它们的键名:
while($row=mysqli_fetch_assoc($res)){
$result[] = $row;
}
mysqli_fetch_assoc 会将数组的键设置为列名。这将发送所有列。如果您不想发送所有列而只发送 7 列,则应将 select 查询修改为:
$sql = "select id, name, weather, date, status, time_in, time_out from information WHERE name= '". $name."' and month = '".$month."'";
并且,还要在您的 select 查询之前清理 $name 和 $month:
$name = mysqli_escape_string($name);
$month = mysqli_escape_string($month);
这是您的代码更新以反映修改:
<?php
define('HOST','127.0.0.1:3307');
define('USER','root');
define('PASS','');
define('DB','androiddb');
$con = mysqli_connect(HOST,USER,PASS,DB) or die('unable to connect');
$name = $_GET['name'];
$month = $_GET['month'];
$months = [
'January' => '01',
'February' => '02',
'March' => '03',
'April' => '04',
'May' => '05',
'June' => '06',
'July' => '07',
'August' => '08',
'September' => '09',
'October' => '10',
'November' => '11',
'December' => '12',
];
if (!isset($months[ $month ])) {
die("Invalid month");
}
$month = $months[ $month ];
$name = mysqli_escape_string($con, $name);
$month = mysqli_escape_string($con, $month);
$sql = "select * from information WHERE name= '". $name."' and month = '".$month."'";
$res = mysqli_query($con,$sql);
$result=array();
while($row=mysqli_fetch_assoc($res)){
$result[] = $row;
}
echo (json_encode(array("result"=>$result)));
mysqli_close($con);
?>