• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • mysqli::get_warnings()

    (PHP 5 >= 5.1.0, PHP 7)

    Get result of SHOW WARNINGS

    说明

    面向对象风格
    mysqli::get_warnings(void): mysqli_warning
    过程化风格
    mysqli_get_warnings(mysqli$link): mysqli_warning
    Warning

    本函数还未编写文档,仅有参数列表。

    With a bit of rooting about with reflection, I spotted that the mysqli_warning class has a next() function, so I tried calling it and it does indeed progress through the available warnings! Following on from my earlier example:
    <?php
    $r = mysqli_query($db, "INSERT INTO blah SET z = '1'");
    $j = mysqli_warning_count($db);
    if ($j > 0) {
      $e = mysqli_get_warnings($db);
      for ($i = 0; $i < $j; $i++) {
        var_dump($e);
        $e->next();
      }
    }
    ?>
    There is a simple way of traversing the warnings:
    <?php
    $r = mysqli_query($db, "INSERT INTO blah SET z = '1'");
    if (mysqli_warning_count($db)) {
      $e = mysqli_get_warnings($db);
      do {
        echo "Warning: $e->errno: $e->message\n";
      } while ($e->next());
    }
    ?>
    
    Take note:
    Calling this function will change the output of mysqli_affected_rows if any warnings are returned. So if you're using mysqli_affected_rows in your application, make sure to call it before calling mysqli_get_warnings.
    I'm not sure how useful this function is as implemented. Take this example:
    CREATE TABLE `blah` (
     `x` varchar(100) NOT NULL,
     `y` varchar(100) NOT NULL,
     `z` varchar(100) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    INSERT INTO blah SET z = '1';
    Query OK, 1 row affected, 2 warnings (0.00 sec)
    mysql> show warnings;
    +---------+------+----------------------------------------+
    | Level  | Code | Message                |
    +---------+------+----------------------------------------+
    | Warning | 1364 | Field 'x' doesn't have a default value | 
    | Warning | 1364 | Field 'y' doesn't have a default value | 
    +---------+------+----------------------------------------+
    Doing the same from PHP using mysqli_get_warnings(), you get this instead:
    object(mysqli_warning)#4 (3) {
     ["message"]=>
     string(38) "Field 'x' doesn't have a default value"
     ["sqlstate"]=>
     string(5) "HY000"
     ["errno"]=>
     int(1364)
    }
    i.e. it only returns the first warning. I suspect it should return an array of these objects rather than just one. At least you know what the return value looks like now, since the docs don't say!