当前位置: 首页> 最新文章列表> 使用 mysqli::get_warnings 却没有任何警告显示?该如何排查问题?

使用 mysqli::get_warnings 却没有任何警告显示?该如何排查问题?

gitbox 2025-08-21
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 这里是与文章内容无关的前置代码或声明部分,可以根据需要自由修改</span></span><span>
</span><span><span class="hljs-title function_ invoke__">error_reporting</span></span><span>(E_ALL);
</span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'display_errors'</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

<h2>使用 <code>mysqli::</span><span><span class="hljs-variable constant_">get_warnings</span></span><span>

执行后,调用 get_warnings() 查看是否有警告。

2. 检查调用 get_warnings() 的时机

必须在执行 SQL 后立即调用,且在执行下一条语句之前。否则之前的警告信息会被清空。

3. 遍历所有警告

有时候会有多条警告,需要循环遍历:


</span><span><span class="hljs-variable">$warn</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">get_warnings</span></span><span>();
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$warn</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">printf</span></span><span>(</span><span><span class="hljs-string">"Warning: %s, %s, %s\n"</span></span><span>, </span><span><span class="hljs-variable">$warn</span></span><span>->errno, </span><span><span class="hljs-variable">$warn</span></span><span>->sqlstate, </span><span><span class="hljs-variable">$warn</span></span><span>->message);
    </span><span><span class="hljs-variable">$warn</span></span><span> = </span><span><span class="hljs-variable">$warn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">next</span></span><span>();
}

4. 检查 MySQL 服务器配置

确认服务器没有关闭警告输出,查看 sql_mode 中是否启用了严格模式,某些模式可能导致警告被当作错误处理。

<span class="fun">SHOW VARIABLES LIKE </span><span><span class="hljs-string">'sql_mode'</span></span><span>;</span>

5. 确认客户端编码和数据类型

编码不匹配或者字段类型不符也可能导致警告,确保数据库和客户端字符集一致,字段类型正确。

四、示例代码

&lt;?php
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_errno) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"连接失败: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}

</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO test_table (varchar_column) VALUES ('这是一个超过字段长度限制的字符串...')"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"执行失败: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error;
}

</span><span><span class="hljs-variable">$warn</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">get_warnings</span></span><span>();
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$warn</span></span><span>) {
    </span><span><span class="hljs-keyword">do</span></span><span> {
        </span><span><span class="hljs-title function_ invoke__">printf</span></span><span>(</span><span><span class="hljs-string">"警告: 编号 %d,状态 %s,信息 %s\n"</span></span><span>, </span><span><span class="hljs-variable">$warn</span></span><span>->errno, </span><span><span class="hljs-variable">$warn</span></span><span>->sqlstate, </span><span><span class="hljs-variable">$warn</span></span><span>->message);
    } </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$warn</span></span><span> = </span><span><span class="hljs-variable">$warn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">next</span></span><span>());
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"没有警告产生。\n"</span></span><span>;
}

</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>

五、总结

当发现 mysqli::get_warnings() 没有任何警告时,不要直接怀疑 API 本身,而应先确认 SQL 语句确实有警告产生,调用时机和方式是否正确,以及服务器和客户端环境配置是否合理。通过上述步骤逐步排查,通常能解决问题并获取期望的警告信息。

希望本文能帮助你更好地理解和使用 mysqli::get_warnings(),提升数据库操作的调试效率。