- 主题:一个PHP的问题请教
if (empty($userInfo['car_type']) && $content !== '' && str_starts_with($content, '车型'))
这句里边,数据库里car_type默认值是null,测试时给content的内容是“车型黑色SUV”,为啥就进不到这个分支呢?
AI也说条件都满足了,但是实测无论如何都进不去哈,别的字段可以写进去数据库
求大佬们帮忙分析一下
--
FROM 106.38.48.*
Trae推荐用了
error_log("[Debug] carType: " . var_export($carType, true));
结果是
PHP message: [Debug] carType: NULL
既然知道是null,为啥我用的
if ($carType === null && ($content = $trimmedContent) !== '' && $startsWithCarType)
却进不去这个分支呢,头疼了哈,还是缺乏编程基础
【 在 wjjchen 的大作中提到: 】
: var_dump 变量看看
: 发自「今日水木 on 2304FPN6DC」
--
FROM 183.241.167.*
数据库里car_type的定义是:
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| user_id | varchar(50) | NO | | NULL | |
| nickname | varchar(50) | YES | | NULL | |
| fare | decimal(10,2) | NO | | 0.00 | |
| is_driver | tinyint(1) | NO | | 0 | |
| car_type | varchar(50) | YES | | NULL | |
其他字段也有varchar(50)的,都没这个问题哈,太烧脑了
【 在 diaozi 的大作中提到: 】
: 几种可能,cartype是字符串null
: content的字符编码不对
--
FROM 183.241.167.*
AI让检查数据库编码问题,我查了,所有的编码都是utf8mb4
文件编码也查了,utf-8
还没想到更好的办法
【 在 ihomd 的大作中提到: 】
: 问题都能写出来,可以直接问ai
--
FROM 183.241.167.*
是的,打印出来看,都是满足条件的哈
报的错是:
Uncaught PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xA6\xE5\x9E\x8B\xE8\xB0...' for column 'car_type' at row 1 in /var/www/html/Database.php:245
看似编码的问题,但查了数据库编码,PDO的charset都是utf8mb4.
要说是中文的问题吧,别的字段也有中文字符,用empty()也没问题
private function __construct() {
try {
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4";
$this->pdo = new PDO($dsn, DB_USER, DB_PASS);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
$errorMsg = date('Y-m-d H:i:s') . " - 数据库连接失败:" . $e->getMessage() . "\n";
error_log($errorMsg, 3, 'debug.log');
throw new Exception("数据库连接失败");
}
}
这些都是AI给的代码,我自己调整的都是大逻辑方面的
【 在 wjjchen 的大作中提到: 】
: 如果编辑器不支持 debug 就把条件检测里面的所有变量都打印一下。
: :
: 发自「今日水木 on 2304FPN6DC」
--
FROM 183.241.167.*
跟大家汇报一下:打印了这个字段的编码,居然是CP936,这是Windows系统默认编码?不知道从哪里设置的,服务器系统是Ubuntu,数据库各种编码设置都是utf8mb4.
这会和PHP文件有关联吗?我让AI在Windows系统里的Trae中写的PHP————————
PHP message: 2025-04-21 23:15:55 - car_type编码检查:
; PHP message: 检测到的编码: CP936
; PHP message: 是否UTF-8: false
; PHP message: 十六进制值: a6e59e8be5928ce59cb0e696b9e58fabe8afb6e5958a
; PHP message: PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xA6\xE5\x9E\x8B\xE5\x92...' for column 'car_type'
--
FROM 106.38.48.*
服务器上用file -i查了
config.php: text/x-php; charset=utf-8
Database.php: text/x-php; charset=utf-8
get_voice.php: text/x-php; charset=utf-8
index.php: text/x-php; charset=utf-8
--
FROM 106.38.48.*
谢谢关注哈
太诡了,我打印一个别的同类型字段,也是从数据库里读出来后打印,居然是不一样的结果
PHP message: Label encoding detection: UTF-8; PHP message: Label is valid UTF-8: true;
这个字段此时还是空的状态,没有内容
【 在 huaxinjuedui 的大作中提到: 】
: 一般PHP报错,那确实就是那里错了
: 然后问题就回到:为啥输出一个这个编码的字串,一步步查
:
--
FROM 106.38.48.*
安装了远程桌面,但是忘了root密码哈
晚上回去找一下字条上的记录再运行workbench试试
不过我现在暂时放弃这个字段了
【 在 sweetgun 的大作中提到: 】
: 代码上没看出来什么问题
: 你在mysql workbench 里看看数据表的编码和字段的编码,确认是不是utf8mb4
:
--
FROM 106.38.48.*
第一个条件不满足的,怎么组合都不影响结果判断
【 在 yangjun0120 的大作中提到: 】
: if ((empty($userInfo['car_type']) && ($content !== '') && (str_starts_with($content, '车型')))) 这样试试
--
FROM 183.241.167.*