Неустранимая ошибка: Uncaught PDOException: Столбец не может быть нулем (НО это не нуль ...) - PullRequest
0 голосов
/ 03 октября 2018

Я получаю фатальную ошибку каждый раз, когда запускается мой 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 ...

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Ваша проблема в том, что 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);

Если вы используете позиционные заполнители, вам не нужно создавать ассоциативный массив для подготовленного оператора.

0 голосов
/ 03 октября 2018

Параметры вашего PDO должны передаваться следующим образом:

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

Вам не хватает части : ключа, переданного в PDOStatement::execute

...