Php 致命错误:未捕获PDOException:列不能为null(但它不是null…)

Php 致命错误:未捕获PDOException:列不能为null(但它不是null…),php,mysql,pdo,prepared-statement,fgetcsv,Php,Mysql,Pdo,Prepared Statement,Fgetcsv,每次运行PHP脚本时,我都会遇到一个致命错误。尽管如此,所有数据仍然上传到数据库。回显$values[0]时,错误状态下没有空值,一切正常。我很困惑 错误 奇怪的是,我昨天似乎没有收到这个警告和错误,所以我把从那以后所做的所有修改都注释掉了,但问题仍然存在 剧本 所有数据点都在那里,没有一个是空的…您的PDO参数需要像这样传递: $statement->execute([ ':foo' => 1, ':bar' => '2001-01-01', ':ba

每次运行PHP脚本时,我都会遇到一个致命错误。尽管如此,所有数据仍然上传到数据库。回显$values[0]时,错误状态下没有空值,一切正常。我很困惑

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

剧本
所有数据点都在那里,没有一个是空的…

您的PDO参数需要像这样传递:

$statement->execute([
    ':foo' => 1,
    ':bar' => '2001-01-01',
    ':baz' => 42
 ]);
您缺少传递给PDOStatement::execute的键的:部分。您的问题是fgetcsv到达文件末尾时返回false

如果提供了无效句柄,fgetcsv将返回NULL;如果出现其他错误(包括文件结尾),fgetcsv将返回FALSE

使用fgetcsv的方式与使用feof仅在存在记录时循环相同

比如说

$stri=执行$values; }否则{ 回显“跳过无效记录”; } } fclose$文件;
如果使用位置占位符,则不需要为准备好的语句构造关联数组。

fgetcsv$file as$key=>$value真的是无效参数吗@Phil为什么foreach循环在到达文件tho的末尾后执行?因为您告诉它要执行。请看一下示例~。您可以也应该像使用feofFYI一样使用fgetcsv,MySQL有一个导入CSV数据的特定工具,它可能更容易使用。请参阅,冒号不是必需的。PHP将为您插入它,如果它丢失请参阅源代码~不知道谁投票否决了你。在我完成php文档中的示例u linkedk之后,我会立即尝试,以便在$row=fgetcsv$file!==FALSE{$num=count$row;for$c=0;$c<$num;$c++{echo$row[$c]。\n;}}@Anthony我已经更新了我的答案,添加了更多的检查,例如$values数组中的10条记录。真的有必要这样格式化$stri变量的值吗?很漂亮。非常感谢你的帮助!!!非常感谢。令人失望的是,有人会投票否决实际答案,但有点典型的笑
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],
  ]);
}
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
$statement->execute([
    ':foo' => 1,
    ':bar' => '2001-01-01',
    ':baz' => 42
 ]);