Php 使用where子句检索MySQL数据

Php 使用where子句检索MySQL数据,php,android,mysql,listview,where-clause,Php,Android,Mysql,Listview,Where Clause,我想知道如何使用WHERE子句从MySQL获取数据,并最终加载到androidlistView?我想根据姓名和月份获取日期、时间和超时。这就是我迄今为止所尝试的 获取数据 public void getData(String name, String month) { class GetDataJSON extends AsyncTask<String, Void, String> { @Override prote

我想知道如何使用
WHERE
子句从
MySQL
获取数据,并最终加载到android
listView
?我想根据姓名和月份获取日期时间超时。这就是我迄今为止所尝试的

获取数据

 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();
        }

    }
public void getData(字符串名称、字符串月份){
类GetDataJSON扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
DefaultHttpClient httpclient=新的DefaultHttpClient(新的BasicHttpParams());
HttpPost HttpPost=新的HttpPost(“http://192.168.1.7/Android/CRUD/retrieveInformation.php");
//取决于您的web服务
setHeader(“内容类型”、“应用程序/json”);
InputStream InputStream=null;
字符串结果=null;
试一试{
HttpResponse response=httpclient.execute(httppost);
HttpEntity=response.getEntity();
inputStream=entity.getContent();
//默认情况下,json是UTF-8
BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream,“UTF-8”),8);
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null)
{
sb.追加(第+行“\n”);
}
结果=sb.toString();
}捕获(例外e){
//哎呀
}
最后{
尝试{if(inputStream!=null)inputStream.close();}捕获(异常挤压){}
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
myJSON=结果;
showList();
}
}
GetDataJSON g=新的GetDataJSON();
g、 执行();
}
受保护的无效显示列表(){
试一试{
JSONObject jsonObj=新的JSONObject(myJSON);
information=jsonObj.getJSONArray(Config.TAG_RESULTS);

对于(inti=0;i您没有在HTTP请求中输入名称和月份

试试这个

HttpPost httppost = new HttpPost("http://192.168.1.7/Android/CRUD/retrieveInformation.php?name="+name+"&month="+month);

希望这有帮助:)

您没有在HTTP请求中输入姓名和月份

试试这个

HttpPost httppost = new HttpPost("http://192.168.1.7/Android/CRUD/retrieveInformation.php?name="+name+"&month="+month);

希望这有帮助:)

看起来您希望将name/month作为参数传递给PHP文件。 最简单的方法是在URL字符串中传递参数(最简单的方法):

然后,name和month被视为PHP文件中的$\u 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\u fetch\u assoc将数组的键设置为列名。这将发送所有列。如果不想发送所有列,而只发送7列,则应将select查询修改为:

$sql = "select id, name, weather, date, status, time_in, time_out from information WHERE name= '". $name."' and month = '".$month."'";
并且,在选择查询之前,还要清理$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);

?>

看起来您希望将name/month作为参数传递给PHP文件。
最简单的方法是在URL字符串中传递参数(最简单的方法):

然后,name和month被视为PHP文件中的$\u 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\u fetch\u assoc将数组的键设置为列名。这将发送所有列。如果不想发送所有列,而只发送7列,则应将select查询修改为:

$sql = "select id, name, weather, date, status, time_in, time_out from information WHERE name= '". $name."' and month = '".$month."'";
并且,在选择查询之前,还要清理$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);

?>

我需要在
getData
中更改/添加任何内容吗?我不这么认为。如果您更改了URL,它可能会起作用。@John Joe:Ye Min Htut(正确!)说,如果您要在PHP中执行
$\u GET['name'];
,那么您最好在URL中有一个参数
name=xyz
。与“month”相同:这两个参数都需要在URL中指定。另外:看看Clayton的回答。他说的是同一件事。Clayton还(正确!)指出您可能希望使用
URIBuilder
,您可以使用
HttpGet()
而不是“HttpPost()”。是的。这是正确的,但您应该清理您的输入(姓名和月份)在sql查询中用作变量以保护sql注入。谢谢,将去看看我是否需要在
getData
中更改/添加任何内容?我不这么认为。如果您更改了URL,它可能会起作用。@John Joe:Ye Min Htut(正确!)说如果您要执行
$\u GET['name'];
在你的PHP中……那么你最好在你的URL中有一个参数
name=xyz
。与“月”相同:两个参数都需要在URL中指定。另外:看看克莱顿的回答。他说的是同样的话。克莱顿也(正确!)指出您可能希望使用
URIBuilder
,并且可以使用
HttpGet()
而不是“HttpPost()”。是的。这是正确的,但您应该清理在sql查询中用作变量的输入(名称和月份),以保护sql注入。谢谢,将去看看您是否需要