求助php判断问题!

查看 70|回复 5
作者:人生如首歌   
目前问题是这样的,下面这三种参数传入,仅可以识别第一种的rank查询
其他两种判断 识别不出来,请那位大佬帮我修改一下,万分感谢!
Filter=name字段
ParentId=code字段
Rank=rank字段
下面是客户端传出来的json参数
现在是三种情况要判断
第一种:
{
   "Filter" : null,
   "ParentId" : "",
   "Rank" : 1
}
仅查询rank=$rank
{
   "Filter" : null,
   "ParentId" : "B",
   "Rank" : 2
}
查询code=$ParentId且rank=$rank的数值
{
   "Filter" : "A1",
   "ParentId" : "",
   "Rank" : 1
}
查询name=包含$Filter开头的数据
[PHP] 纯文本查看 复制代码setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}
// 读取JSON数据
$jsonData = file_get_contents('php://input');
$data = json_decode($jsonData, true);
// 初始化查询条件数组
$conditions = [];
$queryParams = [];
// 根据传入的JSON数据构建查询条件
if (isset($data['Rank']) && $data['Rank'] !== "") {
    $conditions[] = "rank = ?";
    $queryParams[] = intval($data['Rank']); // 转换为整数
}
if (isset($data['ParentId']) && $data['ParentId'] !== "") {
    $conditions[] = "code = ?";
    $queryParams[] = trim($data['ParentId']); // 去除空格
}
if (isset($data['Filter']) && $data['Filter'] !== null) {
    $conditions[] = "name LIKE ?";
    $queryParams[] = "%" . trim($data['Filter']) . "%"; // 去除空格并添加通配符
}
// 构建完整的查询语句
$where = empty($conditions) ? '1=1' : implode(' AND ', $conditions);
$query = "SELECT code, name, rank FROM tushufenlei WHERE $where";
try {
    $stmt = $conn->prepare($query);
    $stmt->execute($queryParams);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    die("查询执行失败: " . $e->getMessage());
}
// 格式化查询结果为期望的JSON结构
$response = [
    "Code" => null,
    "Data" => $results, // 直接使用查询结果作为Data的值
    "ErrorMessageList" => [], // 空数组,或者可以根据需要填充错误信息
    "Ext" => null, // 可以根据需要设置为其他值
    "IsSuccess" => true, // 假设查询总是成功的,或者可以根据实际情况设置
    "LastUpdateReaderTime" => "2024-06-08T12:17:09.3014873+08:00", // 示例时间戳,应替换为动态生成的时间
    "Message" => "", // 空字符串,或者可以根据需要填充消息内容
    "ServerTime" => "2024-06-08T12:17:09.3014873+08:00" // 示例时间戳,应替换为动态生成的时间
];
// 遍历查询结果数组并去除每个字段中的空格
foreach ($response['Data'] as &$row) {
    $row = array_map('trim', $row);
}
// 输出JSON响应
header('Content-Type: application/json');
echo json_encode($response, JSON_UNESCAPED_UNICODE);
// 关闭数据库连接
$conn = null;

字段, 可以根据

stu2162583   

简单打印下 data的数据即可,复杂一点用 xdebug
pxhzai   

为了处理只有`Rank`字段能被正确识别,而其他两个条件(`ParentId`和`Filter`)不能被正确识别的问题,我们需要细化你在条件判断中的逻辑。以下是调整后的PHP代码,它更准确地处理了三种查询场景:
```php
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("数据库连接失败:" . $e->getMessage());
}
// 读取JSON数据
$jsonData = file_get_contents('php://input');
$data = json_decode($jsonData, true);
// 初始化查询条件数组
$conditions = [];
$queryParams = [];
// 根据传入的JSON数据构建查询条件
// 如果Rank存在且不为空字符串,则加入查询条件
if (isset($data['Rank']) && !empty($data['Rank'])) {
    $conditions[] = "rank = ?";
    $queryParams[] = intval($data['Rank']); // 转换为整数
}
// 如果ParentId存在且非空,则加入查询条件
if (isset($data['ParentId']) && !empty(trim($data['ParentId']))) {
    $conditions[] = "code = ?";
    $queryParams[] = trim($data['ParentId']); // 去除空格
}
// 如果Filter存在且非null,则加入查询条件
if (isset($data['Filter']) && $data['Filter'] !== null) {
    $conditions[] = "name LIKE ?";
    $queryParams[] = $data['Filter'] . "%"; // 添加通配符只在Filter开头匹配
}
// 构建完整的查询语句
$where = empty($conditions) ? '1=1' : implode(' AND ', $conditions);
$query = "SELECT code, name, rank FROM tushufenlei WHERE $where";
try {
    $stmt = $conn->prepare($query);
    $stmt->execute($queryParams);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    die("查询执行失败:" . $e->getMessage());
}
// 格式化查询结果为期望的JSON结构
$response = [
    "Code" => null,
    "Data" => $results, // 直接使用查询结果作为Data的值
    "ErrorMessageList" => [], // 空数组,或者可以根据需要填充错误信息
    "Ext" => null, // 可以根据需要设置为其他值
    "IsSuccess" => true, // 假设查询总是成功的,或者可以根据实际情况设置
    "LastUpdateReaderTime" => date('c'), // 动态生成当前时间
    "Message" => "", // 空字符串,或者可以根据需要填充消息内容
    "ServerTime" => date('c') // 动态生成当前时间
];
// 输出JSON响应
header('Content-Type: application/json');
echo json_encode($response, JSON_UNESCAPED_UNICODE);
// 关闭数据库连接
$conn = null;
```
### 关键更改点:
1. **Rank条件**:检查`Rank`是否存在且非空字符串。
2. **ParentId条件**:检查`ParentId`是否存在且经过修剪后非空。
3. **Filter条件**:检查`Filter`是否存在且不为`null`。注意,这里我们改变了`LIKE`查询的构造方式,只在`Filter`的末尾添加通配符,这样可以确保查询的是以`Filter`开头的`name`。
通过这些更改,你可以更准确地处理三种不同的查询场景。
[PHP] 纯文本查看 复制代码setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("数据库连接失败:" . $e->getMessage());
}
// 读取JSON数据
$jsonData = file_get_contents('php://input');
$data = json_decode($jsonData, true);
// 初始化查询条件数组
$conditions = [];
$queryParams = [];
// 根据传入的JSON数据构建查询条件
// 如果Rank存在且不为空字符串,则加入查询条件
if (isset($data['Rank']) && !empty($data['Rank'])) {
    $conditions[] = "rank = ?";
    $queryParams[] = intval($data['Rank']); // 转换为整数
}
// 如果ParentId存在且非空,则加入查询条件
if (isset($data['ParentId']) && !empty(trim($data['ParentId']))) {
    $conditions[] = "code = ?";
    $queryParams[] = trim($data['ParentId']); // 去除空格
}
// 如果Filter存在且非null,则加入查询条件
if (isset($data['Filter']) && $data['Filter'] !== null) {
    $conditions[] = "name LIKE ?";
    $queryParams[] = $data['Filter'] . "%"; // 添加通配符只在Filter开头匹配
}
// 构建完整的查询语句
$where = empty($conditions) ? '1=1' : implode(' AND ', $conditions);
$query = "SELECT code, name, rank FROM tushufenlei WHERE $where";
try {
    $stmt = $conn->prepare($query);
    $stmt->execute($queryParams);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    die("查询执行失败:" . $e->getMessage());
}
// 格式化查询结果为期望的JSON结构
$response = [
    "Code" => null,
    "Data" => $results, // 直接使用查询结果作为Data的值
    "ErrorMessageList" => [], // 空数组,或者可以根据需要填充错误信息
    "Ext" => null, // 可以根据需要设置为其他值
    "IsSuccess" => true, // 假设查询总是成功的,或者可以根据实际情况设置
    "LastUpdateReaderTime" => date('c'), // 动态生成当前时间
    "Message" => "", // 空字符串,或者可以根据需要填充消息内容
    "ServerTime" => date('c') // 动态生成当前时间
];
// 输出JSON响应
header('Content-Type: application/json');
echo json_encode($response, JSON_UNESCAPED_UNICODE);
// 关闭数据库连接
$conn = null;
pxhzai   

上面是国产ai通义千问,这里是gpt
[PHP] 纯文本查看 复制代码setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}
// 读取JSON数据
$jsonData = file_get_contents('php://input');
$data = json_decode($jsonData, true);
// 初始化查询条件数组
$conditions = [];
$queryParams = [];
// 根据传入的JSON数据构建查询条件
if (isset($data['Rank']) && $data['Rank'] !== "") {
    $conditions[] = "rank = ?";
    $queryParams[] = intval($data['Rank']); // 转换为整数
}
if (isset($data['ParentId']) && $data['ParentId'] !== "") {
    $conditions[] = "code = ?";
    $queryParams[] = trim($data['ParentId']); // 去除空格
}
if (isset($data['Filter']) && $data['Filter'] !== null && $data['Filter'] !== "") {
    $conditions[] = "name LIKE ?";
    $queryParams[] = "%" . trim($data['Filter']) . "%"; // 去除空格并添加通配符
}
// 构建完整的查询语句
$where = empty($conditions) ? '1=1' : implode(' AND ', $conditions);
$query = "SELECT code, name, rank FROM tushufenlei WHERE $where";
try {
    $stmt = $conn->prepare($query);
    $stmt->execute($queryParams);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    die("查询执行失败: " . $e->getMessage());
}
// 格式化查询结果为期望的JSON结构
$response = [
    "Code" => null,
    "Data" => $results, // 直接使用查询结果作为Data的值
    "ErrorMessageList" => [], // 空数组,或者可以根据需要填充错误信息
    "Ext" => null, // 可以根据需要设置为其他值
    "IsSuccess" => true, // 假设查询总是成功的,或者可以根据实际情况设置
    "LastUpdateReaderTime" => date('c'), // 动态生成的时间
    "Message" => "", // 空字符串,或者可以根据需要填充消息内容
    "ServerTime" => date('c') // 动态生成的时间
];
// 遍历查询结果数组并去除每个字段中的空格
foreach ($response['Data'] as &$row) {
    $row = array_map('trim', $row);
}
// 输出JSON响应
header('Content-Type: application/json');
echo json_encode($response, JSON_UNESCAPED_UNICODE);
// 关闭数据库连接
$conn = null;
?>
人生如首歌
OP
  


pxhzai 发表于 2024-6-8 21:43
上面是国产ai通义千问,这里是gpt

两个都不行,只能请求返回rank的查询,其他两个还是无法匹配查询返回!
stu2162583   


人生如首歌 发表于 2024-6-9 15:37
两个都不行,只能请求返回rank的查询,其他两个还是无法匹配查询返回!

听我的,肯定是其他的问题,代码没有什么大问题。就调试就好了,你把接受参数打印出来,就能知道问题所在,比如大小写,比如拼音
您需要登录后才可以回帖 登录 | 立即注册

返回顶部