如何将$row日期字段变量传入MySQL DATE_FORMAT语句解决语法报错
问题根因
你遇到的语法报错和DATE_FORMAT函数本身无关,是两处基础写法错误导致的:
- PHP双引号字符串中直接内嵌带引号的数组取值时,数组键的双引号会和外层字符串边界的双引号冲突,直接触发PHP解析器报错,也就是你看到的
unexpected '"'异常 - 你错误地把SQL函数语句直接赋值给了PHP变量,这行代码不会执行数据库查询,只是把一段SQL文本存到了变量里,最终页面会输出原始SQL字符串,根本拿不到格式化后的日期值
- 额外提一句:不要在遍历查询结果的循环里反复发起二次数据库请求,这种写法性能极差,完全没有必要
修复方案
方案1:查询阶段直接格式化日期(推荐)
直接修改初始查询语句,在取数据的时候就用MySQL的DATE_FORMAT把日期转成需要的格式,循环输出时直接调用别名字段即可,性能最高代码也最简洁:
<?php $conn = mysqli_connect("localhost", "root", "", "classmateinfo"); if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } // 查询时直接格式化两个日期字段,用别名方便后续调用 $sql = "SELECT *, DATE_FORMAT(BirthDate, '%M %d, %Y') AS formatted_birth, DATE_FORMAT(DeathDate, '%M %d, %Y') AS formatted_death FROM rip ORDER BY DeathDate"; $result = $conn->query($sql); if ($result->num_rows > 0) { $i = 0; while ($row = $result->fetch_assoc()) { $i++; // 此处保留你原有的其他讣告内容渲染代码 echo "<div class=\"birthdeathdatesection\">"; echo $row["formatted_birth"] . " - " . $row["formatted_death"] . "</div>"; } }
方案2:PHP层处理日期格式
如果你不想修改原有查询逻辑,也可以拿到BirthDate、DeathDate返回的YYYY-MM-DD格式原始值后,用PHP内置日期函数格式化,不需要额外查库:
// 循环内的日期输出部分替换为以下代码即可 echo "<div class=\"birthdeathdatesection\">"; $birthTs = strtotime($row['BirthDate']); $deathTs = strtotime($row['DeathDate']); // 注意PHP日期格式符中F代表完整月份名,和MySQL的%M输出效果完全一致 $birthdate = date('F d, Y', $birthTs); $deathdate = date('F d, Y', $deathTs); echo $birthdate . " - " . $deathdate . "</div>";
原代码错误点对照
你之前写的$birthdate = "SELECT DATE_FORMAT($row["BirthDate"], "%M %d, %Y")";存在两层问题:
- 引号嵌套冲突:外层双引号包裹字符串,内部
$row["BirthDate"]的双引号会被PHP判定为字符串终止,直接抛出语法错误,就算给内部引号加转义符(写成$row[\"BirthDate\"]),也解决不了第二层问题 - 无执行逻辑:这段代码只是把SQL语句作为字符串赋值给变量,没有调用
mysqli_query()向数据库发起请求,根本拿不到格式化后的结果,最终输出的是SELECT DATE_FORMAT(xxx, "%M %d, %Y")这样的纯文本。
内容的提问来源于stack exchange,提问作者Alan - Seattle
相关产品推荐
相关产品推荐

