PHP для цикла с базой данных и данными API рассчитывает только 1 результат - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь выполнить цикл с помощью php-скрипта, чтобы вычислить совокупное владение портфелем людей. Но мой код выдает только одно вычисляемое поле вместо всех из базы данных.

Моя БД выглядит так:

id          email          amount     currency     date_when_bought      price_when_bought
33          test@test.com  100        BTC          2019-04-17            4000
34          test@test.com  50         ETH          2019-04-17            150

Мой код (довольно грязный)

<?php
include('databasecon.php');



    //// GET API JSON DATA
    $coinData = json_decode(file_get_contents('https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC,ETH,XRB,IOTA,XRP,XLM,TRX,LINK,USDT&tsyms=USD'), true);

    //SELECT ALL MAIL
    $result = mysqli_query($con, "SELECT DISTINCT email FROM user_data");
    $email_array = array();
    while($row = mysqli_fetch_array($result))
    {
    $email_array[] = $row['email'];
    };


    // PORTFOLIO ARRAYS
    for ($i = 0; $i < sizeof($email_array); $i++) {

    $sql = mysqli_query($con, "SELECT DISTINCT * FROM crypto_data WHERE email = '$email_array[$i]'");


     while($row = mysqli_fetch_array($sql)){
     $myCoins[$row['currency']] = array('balance' => $row['amount'],
                                    'boughtprice' => $row['price_when_bought']);
     };



 // 0 VALUES FOR CALCULATION
 $portfolioValue = 0;
 $totalNET = 0;
 $Value24H = 0;

 // information in json path ['RAW'] so safeguard here to be sure it exists
 if (isset($coinData['RAW'])) {
   // then loop on all entries $cryptoSymbol will contain for example BTC and cryptoInfo the array USD => [...]
   foreach($coinData['RAW'] as $cryptoSymbol => $cryptoInfo) {
      // safeguard, check path [USD][FROMSYMBOL] exists
      if (!isset($cryptoInfo['USD']) || !isset($cryptoInfo['USD']['FROMSYMBOL'])) {
         // log or do whatever to handle error here
         echo "no path [USD][FROMSYMBOL] found for crypto: " . $cryptoSymbol . PHP_EOL;
         continue;
  }

      // Symbol in on your json path/array [USD][FROMSYMBOL]
      $thisCoinSymbol = $cryptoInfo['USD']['FROMSYMBOL'];
      $coinHeld = array_key_exists($thisCoinSymbol, $myCoins);
      // Only retour held
      if ( !$coinHeld ) { continue; }


       // get price:
             $thisCoinPrice = $cryptoInfo['USD']['PRICE'];

       // get symbol holding:
          if ($coinHeld) {
             $myBalance_units = $myCoins[$thisCoinSymbol]['balance'];
             };

       // calculate total holdings:
           if ($coinHeld) {
              $myBalance_USD = $myBalance_units * $thisCoinPrice;
              $portfolioValue += $myBalance_USD;
              };

                echo '<br>';
                echo $email_array[$i];
                echo $portfolioValue . PHP_EOL;
                echo '<br>';
                echo '<br>';

                $myCoins = null;

   }}};
?>

Шаги:

1 API connection
2 Select Mail adresses from user_data and put them into an Array
3 start for-loop with size of the email_array
4 Query the crypto_data DB to get all results from that mail
5 Put all Data from crypto_data into Array
6 foreach loop the API
7 Calculations
8 Echo the results
9 null $myCoins

В результате я получаю правильный почтовый адрес + вторая строка (id 33), рассчитанная с фактической ценой. Но мой результат также должен подсчитать число 33 и 34, чтобы получить общий результат.

Чтобы уточнить, я получаю "100 * Цена BTC", но мне нужно "100 * Цена BTC + 50 * Цена ETH"

Каким-то образом мой код выводит только 1 строку, но не вычисляет их так, как я хочу сделать здесь:

// calculate total holdings:
           if ($coinHeld) {
              $myBalance_USD = $myBalance_units * $thisCoinPrice;
              $portfolioValue += $myBalance_USD;
              };

Любая помощь приветствуется, большое спасибо.

1 Ответ

1 голос
/ 22 апреля 2019

В вашем коде есть несколько ошибок, таких как:

  • Вы устанавливаете $myCoins в null сразу после первой итерации цикла foreach, поэтому функция array_key_exists() будетпотерпеть неудачу в следующей итерации.Удалите его полностью, нет необходимости устанавливать $myCoins в null.
  • . Держите ниже только внутри внешней петли for.Не следует печатать значение портфеля для каждой итерации цикла foreach, а печатать агрегированное значение портфеля для каждого адреса электронной почты.

    echo '<br>';
    echo $email_array[$i];
    echo $portfolioValue . PHP_EOL;
    echo '<br>';
    echo '<br>';
    
  • Сброс *От 1022 * значение до 0 в конце цикла for.

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

<?php
    include('databasecon.php');

    // GET API JSON DATA
    $coinData = json_decode(file_get_contents('https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC,ETH,XRB,IOTA,XRP,XLM,TRX,LINK,USDT&tsyms=USD'), true);

    //SELECT ALL MAIL
    $result = mysqli_query($con, "SELECT DISTINCT email FROM user_data");
    $email_array = array();
    while($row = mysqli_fetch_array($result)){
        $email_array[] = $row['email'];
    }

    // PORTFOLIO ARRAYS
    for ($i = 0; $i < sizeof($email_array); $i++) {
        $sql = mysqli_query($con, "SELECT DISTINCT * FROM crypto_data WHERE email = '$email_array[$i]'");
        while($row = mysqli_fetch_array($sql)){
            $myCoins[$row['currency']] = array('balance' => $row['amount'], 'boughtprice' => $row['price_when_bought']);
        }

        // 0 VALUES FOR CALCULATION
        $portfolioValue = 0;
        $totalNET = 0;
        $Value24H = 0;

        // information in json path ['RAW'] so safeguard here to be sure it exists
        if (isset($coinData['RAW'])) {
            // then loop on all entries $cryptoSymbol will contain for example BTC and cryptoInfo the array USD => [...]
            foreach($coinData['RAW'] as $cryptoSymbol => $cryptoInfo) {
                // safeguard, check path [USD][FROMSYMBOL] exists
                if (!isset($cryptoInfo['USD']) || !isset($cryptoInfo['USD']['FROMSYMBOL'])) {
                    // log or do whatever to handle error here
                    echo "no path [USD][FROMSYMBOL] found for crypto: " . $cryptoSymbol . PHP_EOL;
                    continue;
                }

                // Symbol in on your json path/array [USD][FROMSYMBOL]
                $thisCoinSymbol = $cryptoInfo['USD']['FROMSYMBOL'];
                $coinHeld = array_key_exists($thisCoinSymbol, $myCoins);
                // Only retour held
                if ( !$coinHeld ) { continue; }

                // get price:
                $thisCoinPrice = $cryptoInfo['USD']['PRICE'];

                // get symbol holding:
                if ($coinHeld) {
                    $myBalance_units = $myCoins[$thisCoinSymbol]['balance'];
                }

                // calculate total holdings:
                if ($coinHeld) {
                    $myBalance_USD = $myBalance_units * $thisCoinPrice;
                    $portfolioValue += $myBalance_USD;
                }
            }
        }
        echo '<br>';
        echo $email_array[$i];
        echo $portfolioValue . PHP_EOL;
        echo '<br>';
        echo '<br>';
        $portfolioValue = 0;
    }
?>

Sidenote: Узнайте о подготовленном операторе , потому что сейчас ваш запрос подвержен атаке SQL-инъекцией.Также смотрите , как вы можете предотвратить внедрение SQL в PHP .

...