如何实现Android应用从MySQL(WordPress)数据库获取数据?
Android 从WordPress MySQL数据库获取数据的完整实现方案
嘿,看起来你已经在动手搭建Android应用和WordPress数据库之间的桥梁了!我帮你把这段PHP脚本补全完善,再搭配Android端的调用示例和关键注意事项,让整个流程顺畅跑起来。
第一步:完善PHP中间层脚本
这个脚本作为Android和WordPress数据库的中间API,负责处理请求、查询数据并返回JSON格式的结果(Android端最易处理的格式):
<?php /** * Android应用从WordPress MySQL数据库取数据的API脚本 */ // 数据库配置(强烈建议把这些配置移到Web根目录外的单独文件,避免泄露) define('DB_HOST', 'localhost'); define('DB_USER', 'your_db_username'); define('DB_PASS', 'your_db_password'); define('DB_NAME', 'your_wordpress_db_name'); // 初始化数据库连接 $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); // 检查连接状态 if ($conn->connect_error) { die(json_encode(['success' => false, 'message' => '数据库连接失败: ' . $conn->connect_error])); } // 设置UTF-8字符集,避免中文乱码 $conn->set_charset('utf8mb4'); // 示例:根据Android端传入的分类ID获取已发布文章 $categoryId = isset($_GET['category_id']) ? intval($_GET['category_id']) : 0; // WordPress核心表查询(注意表前缀,默认是wp_,如果改了要替换) $sql = "SELECT ID, post_title, post_content, post_date FROM wp_posts WHERE post_status = 'publish' AND post_type = 'post'"; // 如果有分类ID,添加过滤条件(用预处理语句防止SQL注入) if ($categoryId > 0) { $stmt = $conn->prepare($sql . " AND ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id = ?)"); $stmt->bind_param("i", $categoryId); $stmt->execute(); $result = $stmt->get_result(); } else { $result = $conn->query($sql); } // 组装返回数据 $response = []; if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $response[] = [ 'id' => $row['ID'], 'title' => $row['post_title'], 'content' => wp_strip_all_tags($row['post_content']), // 移除WordPress的HTML标签 'date' => $row['post_date'] ]; } echo json_encode(['success' => true, 'data' => $response]); } else { echo json_encode(['success' => false, 'message' => '未找到匹配的数据']); } // 清理资源 if (isset($stmt)) $stmt->close(); $conn->close(); ?>
第二步:Android端调用API获取数据
推荐用OkHttp来处理网络请求,简洁稳定,下面是Kotlin示例:
1. 添加依赖
在你的app/build.gradle中添加OkHttp和Gson依赖(Gson用于解析JSON):
dependencies { implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.google.code.gson:gson:2.10.1' }
2. 网络请求与数据解析
class MainActivity : AppCompatActivity() { private val okHttpClient = OkHttpClient() private val gson = Gson() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) fetchPostsFromApi(1) // 传入分类ID,比如1 } private fun fetchPostsFromApi(categoryId: Int) { val requestUrl = "https://your-domain.com/your-script.php?category_id=$categoryId" val request = Request.Builder().url(requestUrl).build() okHttpClient.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 请求失败,切换到UI线程提示用户 runOnUiThread { Toast.makeText(this@MainActivity, "请求出错: ${e.message}", Toast.LENGTH_SHORT).show() } } override fun onResponse(call: Call, response: Response) { response.body?.string()?.let { jsonStr -> val apiResponse = gson.fromJson(jsonStr, ApiResponse::class.java) runOnUiThread { if (apiResponse.success) { // 成功获取数据,处理逻辑(比如显示到RecyclerView) apiResponse.data?.forEach { post -> Log.d("Post", "标题: ${post.title}") } } else { Toast.makeText(this@MainActivity, apiResponse.message, Toast.LENGTH_SHORT).show() } } } } }) } // 数据模型类,和PHP返回的JSON结构对应 data class ApiResponse( val success: Boolean, val message: String?, val data: List<Post>? ) data class Post( val id: Int, val title: String, val content: String, val date: String ) }
关键注意事项
- 安全优先级最高:
- 绝对不要把数据库密码硬编码在PHP脚本里!把配置文件放在Web根目录之外,通过
include引入。 - 必须用HTTPS传输数据,防止明文泄露。
- 始终用预处理语句处理用户输入,彻底避免SQL注入风险。
- 绝对不要把数据库密码硬编码在PHP脚本里!把配置文件放在Web根目录之外,通过
- WordPress适配:如果你的WordPress修改了表前缀(不是默认的
wp_),一定要替换SQL中的表名。 - 权限控制:给数据库用户只分配查询权限,不要给超级权限,降低风险。
内容的提问来源于stack exchange,提问作者Alain
相关产品推荐
相关产品推荐

