【问题标题】:php script won't throw exceptionphp脚本不会抛出异常
【发布时间】:2012-04-08 18:56:43
【问题描述】:

我正在尝试使用异常验证我的 php 表单,但不知何故它不起作用。如果用户在“nameg”中输入任何不是字符串的字符并且在“amountg”中输入任何不是整数的字符,则应该抛出异常。在这种情况下是否应该使用异常:

if(!empty($_POST['nameg']) && !empty($_POST['amountg']))
{
    $user="rootdummy";
    $pass="password";
    $db="practice";
    $nameg=$_POST['nameg'];
    $amountg=$_POST['amountg'];

    try{
        if(!is_int($amountg) || !is_string($nameg)){
            throw new Exception("This is the exception message!");
        }
    }
    catch (Exception $e){
        $e->getMessage();
    }

    mysql_connect('localhost',$user,$pass) or die("Connection Failed!, " . mysql_error());
    $query="INSERT INTO practable (name,given) VALUES('$nameg',$amountg) ON DUPLICATE KEY UPDATE name='$nameg', given=IFNULL(given + $amountg,$amountg)";
    mysql_select_db($db) or die("Couldn't connect to Database, " . mysql_error());
    mysql_query($query) or die("Couldn't execute query! ". mysql_error());

    mysql_close() or die("Couldn't disconnect!");
    include("dbclient.php");
    echo "<p style='font-weight:bold;text-align:center;'>Information Added!</p>";
}

【问题讨论】:

  • 您的代码容易受到 SQL 注入的攻击,并且 mysql_* 已被温和弃用。
  • 你以$_POST['amountg'] 发布了什么值?
  • 是 $_POST['amountg'] 是用户通过表单输入的值。
  • 来自 _POST/_GET/_REQUEST 的所有内容都是一个字符串,即使它是一个“数字”。
  • @MarcB 我想现在我明白为什么即使我传递一个整数它也会抛出异常......你将如何验证这个表单?

标签: php mysql forms exception exception-handling


【解决方案1】:

你正在捕捉它并执行一个几乎什么都不做的语句。

$e-&gt;getMessage(); 只是将其作为字符串获取并丢弃而不回显它。

要么回显它,要么重新抛出,或者,如果你只是想在那个时候退出,根本不要捕获异常(你可以删除 try 和 catch 块)。

【讨论】:

  • 没错,我刚刚添加了那个。但是,如果抛出异常,我希望脚本中断。我添加了休息;在 catch 块中,但它给了我一个错误:致命错误:无法在 c:\ 中中断/继续 1 级我使用表单验证异常的方式是否正确,或者是否应该像初始检查一样使用 if/else 条件以查看是否表格是空的?
  • 我认为你只是想抛出,所以我编辑了它。抛出而不捕获会导致异常向上冒泡,直到它被捕获或到达任何 set_exception_handler。
  • 好吧,我想要这样的东西:try{} catch{echo "请再次输入!";include("form.php");break;} 类似的东西再次显示表单并显示一条消息, 抛出而不捕获异常会给我一个异常错误。
  • 你可以这样做,只是不要包含 break 语句。当它到达 catch 块的末尾时,代码将继续,或者使用 return 从函数返回。
【解决方案2】:

大概你想输出异常?做:

echo $e-&gt;getMessage();

编辑:作为对您后来关于脚本结束的评论的回应,将 MySQL 查询放在 try 块中。

编辑 2: 更改验证以响应您的 cmets。

if(!empty($_POST['nameg']) && !empty($_POST['amountg']))
{
    $user="rootdummy";
    $pass="password";
    $db="practice";
    $nameg=$_POST['nameg'];
    $amountg=$_POST['amountg'];

    try{

        if(!ctype_numeric($amountg) || !ctype_alpha($nameg)){
            throw new Exception("This is the exception message!");
        }

      mysql_connect('localhost',$user,$pass) or die("Connection Failed!, " . mysql_error());
      $query="INSERT INTO practable (name,given) VALUES('$nameg',$amountg) ON DUPLICATE KEY UPDATE name='$nameg', given=IFNULL(given + $amountg,$amountg)";
      mysql_select_db($db) or die("Couldn't connect to Database, " . mysql_error());
      mysql_query($query) or die("Couldn't execute query! ". mysql_error());

      mysql_close() or die("Couldn't disconnect!");
      include("dbclient.php");
      echo "<p style='font-weight:bold;text-align:center;'>Information Added!</p>";

    }
    catch (Exception $e){
        echo $e->getMessage();
    }
}

【讨论】:

  • 刚刚修改了代码试了一下,确实有效!但是现在它会抛出异常,即使“nameg”包含字符串并且“amountg”包含整数。每次都扔!我对例外太菜鸟了吗? :(
  • 在 catch 块中,放入 var_dump($amountg)var_dump($nameg) 并向我们展示输出。
  • 这是我得到的:这是异常消息!string(2) "45" string(7) "testone"
  • 如您所见,它们都是字符串,因此 is_int($amountg) 失败。改用is_numeric($amountg)(允许小数)或ctype_digit($amountg)(不允许小数)
  • 因为它仍然是一个字符串(只是一串数字)。使用ctype_alpha($nameg)
【解决方案3】:

确实如此,但是除了捕获它之外,您对异常没有做任何事情。

试试

echo $e->getMessage()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2023-03-23
    • 2011-11-02
    相关资源
    最近更新 更多