<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()查看是否有警告。
必須在執行SQL 後立即調用,且在執行下一條語句之前。否則之前的警告信息會被清空。
有時候會有多條警告,需要循環遍歷:
</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>();
}
確認服務器沒有關閉警告輸出,查看sql_mode中是否啟用了嚴格模式,某些模式可能導致警告被當作錯誤處理。
<span class="fun">SHOW VARIABLES LIKE </span><span><span class="hljs-string">'sql_mode'</span></span><span>;</span>
編碼不匹配或者字段類型不符也可能導致警告,確保數據庫和客戶端字符集一致,字段類型正確。
<?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() ,提升數據庫操作的調試效率。
相關標籤:
mysqli