我是PHP的新手,我正在尝试学习PDO。我正在尝试构建一个页面,我可以将信息(新闻等)发布到数据库和另一个页面,我可以在其中查看数据库中的内容。
我在这里读过,人们说你不应该使用try catch操作符来处理错误消息。我理解这一点,因为你不应该使用类似的东西:
CreateNews.php
<?php
header("Content-Type: text/html; charset=utf-8");
// Create presets for connection
$dsn = "mysql:host=localhost;dbname=dbname;charset=utf8'";
$opt = array(
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"
);
// Check if form is being posted
if ($_SERVER['REQUEST_METHOD'] == "POST") {
// Check if fields are empty
if (!$_POST['name'] || !$_POST['email'] || !$_POST['title'] || !$_POST['content'] || !$_POST['timestamp']) {
echo "<p>Please fill in all of the fields!</p>";
exit();
}
else {
try { // Connects to server and executes the transfer of data
$pdo = new PDO($dsn, 'root','', $opt);
$sth = $pdo->prepare("INSERT INTO news (name, email, title, content, timestamp)
VALUES (:name, :email, :title, :content, :timestamp)");
$sth->bindParam(':name', $_POST['name']);
$sth->bindParam(':email', $_POST['email']);
$sth->bindParam(':title', $_POST['title']);
$sth->bindParam(':content', $_POST['content']);
$sth->bindParam(':timestamp', $_POST['timestamp']);
$sth->execute();
}
catch (PDOException $e) {
echo $e->getMessage();
}
echo "<p>Data submitted successfully!</p><br />To create another post <a href" . $_SERVER['PHP_SELF'] . ">click here</a>";
}
}
// Close the connection
$pdo = null;
?>
所以我删除了上面的catch PDOException,然后收到错误消息:
解析错误:语法错误,意外&#39;回声&#39; (T_ECHO),期待捕获(T_CATCH)
如果我删除了回声,我仍然会得到&#34;期待捕获T_CATCH错误。
当我们说你不应该使用try catch操作符时,我是否误解了人们的意思?
如果是这样,我应该如何使用它?
如果您在代码中发现我做错了或不必要的任何内容,请随时发表评论。我对这一切都很陌生,还在努力学习! :)
谢谢!
答案 0 :(得分:0)
我在这里读过,人们说你不应该使用try catch操作符来处理错误信息。
这些人都很对。
不应将异常用于正常的应用程序流。
让我们看一下php manual中的inverse($x)
函数,该函数会返回1/$x
,如果您将0
作为$x
传递,则会抛出异常你不能除以0
。
让我们进一步假设您的变量来自已发布的表单,因此可以输入0
。在这种情况下,您应该使用if
- 子句检查正确的值,例如:
<?php
if (intval($_POST['value']) == 0) {
echo 'You cannot pass 0 into inverse(). Please enter another value.';
} else {
echo 'We computed the inverse: ' . inverse(intval($_POST['value']));
}
?>
您不应该将try-catch构造用于此类用途。在这种情况下完全可以预期用户可能输入该功能无法处理的数字。您应该在正常的应用程序流程中检查错误的值并处理它们。
现在让我们假设变量$x
由supercomplicated_function
填充,0
总是返回一个数字,永远不会返回0
。既然您确定变量永远不会等于<?php
$x = supercomplicated_function();
try {
$y = inverse($x);
echo 'We computed the inverse: ' . $y;
} catch (Exception $e) {
echo 'Unexpected situation. Do not know how to go on. Aborting.';
die();
}
?>
,那么为什么要检查这种情况呢?
相反,你可以在这里使用try-catch:
if
如果您在正常情况下遇到某些特定错误,则应使用server has gone away
声明检查它们
如果不这样做,请让异常处理问题。
在您的情况下,您通常不希望查询执行出现异常。可能的错误原因是deadlock
或if
。这种错误是可能的,但不是在“正常”条件下。因此,您不希望使用{{1}}语句检查它们(您甚至无法事先检查可能的死锁)。
因此,在您的情况下,您希望使用例外。那完全没问题。