Я пытаюсь вычислить индикатор импульса из импортированного файла 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 |
Что-то не так в моем коде (очевидно). Любые подсказки или подсказки будут действительно оценены. Извините за ужасный английский.
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();
}
}
}