致命错误:uncaughtpdoexception:列不能为null(但它不是null…)

gjmwrych  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(368)

每次运行php脚本时都会出现致命错误。尽管如此,所有的数据仍然上传到数据库。什么时候 $values[0] 是回声,没有 NULL 值作为错误状态,一切正常。我很困惑。

错误

[02-Oct-2018 19:59:54 America/Vancouver] PHP Warning:  Invalid argument supplied for foreach() in /home1/antonfa1/public_html/trading-history/process.php on line 22
[02-Oct-2018 19:59:54 America/Vancouver] PHP Fatal error:  Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'trade_date' cannot be null in /home1/antonfa1/public_html/trading-history/process.php:48
Stack trace:

# 0 /home1/antonfa1/public_html/trading-history/process.php(48): PDOStatement->execute(Array)

# 1 {main}

  thrown in /home1/antonfa1/public_html/trading-history/process.php on line 48

奇怪的是,我昨天似乎没有收到这个警告和错误,所以我把从那以后所做的所有修改都注解掉了,但问题仍然存在。

脚本

include 'includes/connect.php';
$stri = 'INSERT INTO trades (trade_date, trade_time, trade_datetime, trade_transaction, trade_symbol, trade_status, trade_quantity, trade_filled, trade_price, trade_value) VALUES (:date, :time, :datetime, :transaction, :symbol, :status, :quantity, :filled, :price, :value)';

$file = fopen($_SESSION['file'], 'r');

while (!feof($file)) {

  $values = [];

  foreach (fgetcsv($file) as $key => $value) {
    array_push($values, $value);
  }

  echo $values[0] . '<br>';

  $stat = $conn->prepare($stri);
  $stat->execute([
    'date' => $values[0],
    'time' => $values[1],
    'datetime' => $values[2],
    'transaction' => $values[3],
    'symbol' => $values[4],
    'status' => $values[5],
    'quantity' => $values[6],
    'filled' => $values[7],
    'price' => $values[8],
    'value' => $values[9],
  ]);
}

fgetcsv($file) as $key => $value 真的是一个无效的论点吗?这是导致这个“错误”错误的潜在原因吗?我昨天没有收到这个警告:/

回声

2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02
2018-10-02

所有的数据点都在那里,没有 NULL ...

csbfibhn

csbfibhn1#

您的pdo参数需要这样传递:

$statement->execute([
    ':foo' => 1,
    ':bar' => '2001-01-01',
    ':baz' => 42
 ]);

你错过了 : 部分密钥传递给 PDOStatement::execute

cnjp1d6j

cnjp1d6j2#

你的问题是 fgetcsv() 退货 false 当它到达文件末尾时。。。
如果提供的句柄无效,fgetcsv()将返回null;如果出现其他错误(包括文件结尾),则返回false。
你可以用 fgetcsv() 和你用的方法一样 feof() 只在有记录要查找时循环。
例如

$stri = <<<_SQL
INSERT INTO trades (
  trade_date, 
  trade_time, 
  trade_datetime, 
  trade_transaction, 
  trade_symbol, 
  trade_status, 
  trade_quantity, 
  trade_filled, 
  trade_price, 
  trade_value
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
_SQL; // note the positional placeholders

$stat = $conn->prepare($stri); // prepare once, not in a loop
$file = fopen($_SESSION['file'], 'r');

while($values = fgetcsv($file)) { // EOF will return false and exit the loop
    if (count($values) === 10) {
        echo $values[0] . '<br>';
        $stat->execute($values);
    } else {
        echo 'Skipping invalid record';
    }
}
fclose($file);

如果使用位置占位符,则不需要为准备好的语句构造关联数组。

相关问题