有没有办法在 PHP 中捕获 MySQL 和数据库错误?
Posted
技术标签:
【中文标题】有没有办法在 PHP 中捕获 MySQL 和数据库错误?【英文标题】:Is there any way to catch MySQL and database errors in PHP? 【发布时间】:2011-09-01 12:16:52 【问题描述】:有时我会遇到类似的数据库错误
警告:mysql_connect() [function.mysql-connect]:用户'test'@'101.190.193.83'的访问被拒绝(使用密码:YES)
无法连接:用户 'test'@'101.190.193.83' 的访问被拒绝(使用密码:YES)"
但密码确实没有变化。
有什么方法可以在日志文件中捕获此错误并在屏幕上显示一些不错的消息,例如“服务器错误。请稍后再试。”
【问题讨论】:
我实际上正在开发一个开源项目来捕捉错误,在屏幕上显示一个很好的消息,并使用比标准错误日志提供的更多信息来记录它们。 jarofgreen.co.uk/2011/01/tracking-errors-with-php 或 elastik.sf.net 【参考方案1】:如果你不想让 PHP 显示警告,你必须使用“@”操作符
$connect = @mysql_connect(HOST, USER, PASS);//won't display the warning if any.
if (!$connect) echo 'Server error. Please try again sometime. CON';
您也可以考虑在生产环境中将php.ini
文件中的display_errors 设置为0
你也可以考虑PDO连接MySQL,它默认使用异常来报告错误,
try
$dbh = new PDO($dsn, $user, $password);
catch (PDOException $e)
echo 'Could not connect : ' . $e->getMessage();
【讨论】:
【参考方案2】:<?php
$connect = mysql_connect(HOST, USER, PASS);
if(!$connect) echo 'Server error. Please try again sometime. CON';
$select_db = mysql_select_db(DATABASE);
if(!$select_db) echo 'Server error. Please try again sometime. DB';
?>
【讨论】:
格式丢失,似乎***无法识别它..pastebin.com/EFefnNSp 我为你修好了。要获取代码格式,请在代码前放置 4 个空格(或 1 个制表符)。您可以通过选择文本并按 CTRL+K 轻松完成此操作。【参考方案3】:有什么方法可以将这些错误捕获到日志文件中...?
是的。所有 PHP 错误和警告都会写入 Web 服务器的错误日志文件,因此您无需做任何其他事情——它已经完成了。
要回答您问题的第二部分,如果您不想在屏幕上显示原始错误消息,您可以通过以下两种方式之一来防止这种情况:
在函数调用前使用@
符号——即$db = @mysql_connect(...);
。这将仅针对该特定函数调用关闭错误报告。过度使用这种技术通常被认为是一个坏主意,但偶尔这样做是合法的。
更好的选择可能是关闭全局错误报告标志,可以在您的PHP.ini
、本地.htaccess
文件中,或者在程序中使用ini_set()
。
通常,网页上的错误报告只能在您开发网站时使用。网站上线后,您应该打开错误报告,这样您就不会在客户面前精心构建的页面布局中随机出现 PHP 错误。发生的任何错误仍会写入服务器错误日志,但不会显示在页面上。
对于 MySQL 错误,例如您遇到的错误,您仍然可以通过使用 mysql_error()
函数在程序中找到错误本身。这将包含最后发生的错误的详细信息,因此您可以以编程方式检查它并报告合理的错误消息。
【讨论】:
【参考方案4】:来源:http://wallstreetdeveloper.com/php-database-connection/
这里是php中数据库连接的示例代码:
<?php
//Step-1 : Create a database connection
$connection=mysql_connect(“localhost”,”root”,”root”);
if(!$connection)
die(“Database Connection error” . mysql_error());
//Step-2 : Select a database to use
$db=mysql_select_db(“widget_corp”,$connection);
if(!$db)
die(“Database Selection error” . mysql_error());
?>
<html>
<head>
<title>Database</title>
</head>
<body>
<?php
//Step 3 : Perform database Queury
$result=mysql_query(“select * from subjects”,$connection);
if(!$result)
die(“No rows Fetch” . mysql_error());
//Step 4 : Use returned data
while($row=mysql_fetch_array($result))
//echo $row[1].” “.$row[2].”<br>”;
echo $row["menu_name"].” “.$row["position"].”<br>”;
?>
</body>
</html>
<?php
//Step 5 : Close Connection
mysql_close($connection);
?>
【讨论】:
【参考方案5】:try
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// if your are not set this attributes you won't get any exceptions.
catch (PDOException $e)
echo 'Server error. Please try again some time.';
【讨论】:
以上是关于有没有办法在 PHP 中捕获 MySQL 和数据库错误?的主要内容,如果未能解决你的问题,请参考以下文章
php中,用try/catch捕获了异常,为啥还会有警告?有没有办法去掉呢?