PHP MySQL PDO: странный цикл при расчете индикатора импульса

0

Я пытаюсь вычислить индикатор импульса из импортированного файла csv, который является историческим данным фондового рынка. Я сделал таблицу "momentum_data", которая содержит столбцы Date, Close, Close14, Momentum. И проблема, которую я получил, - это вставить мои данные в таблицу momentum_data из php с PDO.

Самый близкий aproach, который я сделал, использовал этот код:

foreach ($sql as $data) {
$tanggal = $data['Date'];
$close = $data['Close'];
$close[] = $data['Close'];
$jumlah = count($close);
$momentum= 0;

        for($i=14;$i<$jumlah;$i++){
          $close1 = $close[$i-14];
          $momentum = $close[$i]/$close1*100;

  $sql2->bindParam(':close14', $close);
  $sql2->bindParam(':Date', $tanggal);
    $sql2->bindParam(':close', $close1);
    $sql2->bindParam(':momentum', $momentum);
    $sql2->execute();}}

и запросы:

$conn = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = $pdo->prepare("SELECT * FROM csv_data ORDER BY Date");

$sql-> Execute(); а также

$conn = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql2 = $conn->prepare("INSERT INTO momentum_data VALUES (:Date,:close,:close14,:momentum)");

Данные были вставлены в базу данных, но данные дублировались на основе какой строки данных. результат будет выглядеть следующим образом:

|no|data1|data2|
|1 |1    |1    |
|2 |2    |2    |
|2 |2    |2    |
|3 |3    |3    |
|3 |3    |3    |
|3 |3    |3    |

Что-то не так в моем коде (очевидно). Любые подсказки или подсказки будут действительно оценены. Извините за ужасный английский.

  • 0
    подготовить запрос и связать параметры вне цикла
  • 0
    @RamRaider Я действительно поставил запрос вне цикла. Если я связываю параметры вне цикла, он будет вставлять только последние данные из цикла.
Теги:
pdo

1 ответ

0

preparing запрос и binding параметры за пределами цикла, вам просто нужно переназначить переменные в цикле перед выполнением оператора ~, хотя я нашел, что именование переменных здесь немного запутанно.

$conn = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $conn->prepare("insert into 'momentum_data' ( 

date, close, close14, momentum) values (: date,: close,: close14,: momentum) "), if ($ stmt) {

    $stmt->bindParam(':date', $tanggal );
    $stmt->bindParam(':close', $close1 );
    $stmt->bindParam(':close14', $close );
    $stmt->bindParam(':momentum', $momentum );


    $sql='select * from 'csv_data' order by 'date';';
    $results=$conn->query( $sql );

    $tmp=array();/* it was confusing having $close and $close[] */


    while( $rs=$results->fetch_object() ){

        $tanggal    = $rs->date;
        $close      = $rs->close;
        $tmp[]      = $rs->close;
        $jumlah     = count( $tmp );
        $momentum   = 0;


        for( $i=14; $i < $jumlah; $i++ ){
            $close1 = $tmp[ $i-14 ];
            $momentum = $tmp[ $i ] / $close1 * 100;
            $stmt->execute();
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню