Запись запроса в mysql

159
22 сентября 2019, 21:30

допишите пожалуйста код кому не сложно, только с использованием PDO. Описание: eсть база данных vote в которой 2 таблицы account и votes. В таблице votes 6 колонок: id , vote_id, date, nick, votes. В таблице account 2 колонок: username , vp. Цель данного скрипта (разделен на 2 этапа): 1. подключается по адресу -> считывает добавленные строки -> записывает их данные в таблицу votes. 2. если строка добавилась, в таблице account ищет в колонке username нужный nick и добавляет баллы в колонку vote_point в струку с данным ником.

    $db_host = 'host';
    $db_user = 'login';
    $db_pass = 'pass';
    $db_name = 'vote';
    $encoding = 'utf8';
    $table = 'tabl stat';
    // ссылка на сбор статистики
    $file = 'http://site.ru/';
      $vote = 2; //количество бонусов
      $vip_vote= 4; //количество бонусов 2
    try {
        $dbh = new PDO("mysql:dbname={$db_name};host={$db_host}", $db_user, $db_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES '{$encoding}'"));
        // проверяем, есть ли у нас уже статистика в таблице
        $row = $dbh->query("SELECT MAX(`vote_id`) FROM `{$table}`")->fetch(PDO::FETCH_NUM);
        // если есть, то запоминаем максимальный ID
        $last_id = empty($row) ? 0 : $row[0];
        $rows = 0;
        if (($fp = fopen($file, "r")) !== false) {
            while (($data = fgetcsv($fp, 1000, "\t")) !== false) {
                // если в строке не 5 элементов или ID уже есть, то пропускаем строку
                if (count($data) != 5 || $last_id >= $data[0])
                  continue;
                  $fields = array(
                      ':vote_id' => $data[0],
                      ':date' => date('Y-m-d H:i:s', strtotime($data[1])),
                      ':ip' => $data[2],
                      ':nick' => $data[3],
                      ':votes' => $data[4],
                  );
                  // сохраняем строку в таблицу
                  $sth = $dbh->prepare("INSERT INTO `{$table}` (`vote_id`, `date`, `ip`, `nick`, `votes`) VALUES (:vote_id, :date, :ip, :nick, :votes)");
                  if ($sth->execute($fields))
                    $rows ++;
                  else
                    var_dump($sth->errorInfo());
        }
        fclose($fp);
        echo "Добавлено {$rows} записей <br>";
    } else {
        echo 'Ошибка открытия файла';
    }
} catch (PDOException $e) {
    echo 'Ошибка подключения: ' . $e->getMessage();
}

на mysqli это выглядит так

 $CheckAcc1 = mysqli_query($link, "SELECT username FROM account WHERE username = '$VoteChar'");
    $CheckAcc = mysqli_num_rows($CheckAcc1);
    // Проверяем аккаунт
    if ($CheckAcc > 0) {
        // Статус
        $AccountID1 = mysqli_query($link, "SELECT username FROM account WHERE username = '$VoteChar'");
        $AccountID = mysqli_fetch_row($AccountID1);
        // Проверяем голоса
        $CheckVote1 = mysqli_query($link, "SELECT * FROM stat WHERE vote_id = '$VoteID' AND date = '$VoteTime' AND nick = '$VoteChar' AND votes = '$VoteType';");
        $CheckVote = mysqli_num_rows($CheckVote1);
        // Тип голоса
        if ($VoteType == 2) {
            $RewardCoins = $vip_vote;
        }
        else {
            $RewardCoins = $vote;
        }
        // Выдача баллов
        if ($CheckVote <= 0) {
            $Query = mysqli_query($link, "UPDATE account SET vp = vp + $RewardCoins WHERE username = '$AccountID[0]'");
        }
    }

Вот что получилось, но в базу table_acc все равно не начисляет бонусы

    $db_host = 'host';
    $db_user = 'login';
    $db_pass = 'pass';
    $db_name = 'vote';
    $encoding = 'utf8';
    $table = 'tabl stat';
    $table2 = 'tabl acc';
    // ссылка на сбор статистики
    $file = 'http://site.ru/';
      $vote = 2; //количество бонусов
      $vip_vote= 4; //количество бонусов 2
    try {
        $dbh = new PDO("mysql:dbname={$db_name};host={$db_host}", $db_user, $db_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES '{$encoding}'"));
        // проверяем, есть ли у нас уже статистика в таблице
        $row = $dbh->query("SELECT MAX(`vote_id`) FROM `{$table}`")->fetch(PDO::FETCH_NUM);
        // если есть, то запоминаем максимальный ID
        $last_id = empty($row) ? 0 : $row[0];
        $rows = 0;
        if (($fp = fopen($file, "r")) !== false) {
            while (($data = fgetcsv($fp, 1000, "\t")) !== false) {
                // если в строке не 5 элементов или ID уже есть, то пропускаем строку
                if (count($data) != 5 || $last_id >= $data[0])
                  continue;
                  $fields = array(
                      ':vote_id' => $data[0],
                      ':date' => date('Y-m-d H:i:s', strtotime($data[1])),
                      ':ip' => $data[2],
                      ':nick' => $data[3],
                      ':votes' => $data[4],
                  );
          if (':votes' == 2) {
            $RewardCoins = $vip_vote;
        }
        else {
            $RewardCoins = $vote;
        }                   
                  // сохраняем строку в таблицу
                  $sth = $dbh->prepare("INSERT INTO `{$table}` (`vote_id`, `date`, `ip`, `nick`, `votes`) VALUES (:vote_id, :date, :ip, :nick, :votes)");
          $sth1 = $dbh->prepare("UPDATE {$table2} SET vp = vp + $RewardCoins WHERE (username) = :nick AND not exists(select 1 from {$table} where vote_id = :vote_id AND date = :date AND nick = :nick AND votes = :votes)");
                  if ($sth->execute($fields))
                    $rows ++;
                  else
                    var_dump($sth->errorInfo());
        }
        fclose($fp);
        echo "Добавлено {$rows} записей <br>";
    } else {
        echo 'Ошибка открытия файла';
    }
} catch (PDOException $e) {
    echo 'Ошибка подключения: ' . $e->getMessage();
}
Answer 1

Думаю надо что то в этом роде:

   if (($fp = fopen($file, "r")) !== false) {
        // Готовим запросы один раз. Это значительно ускоряет выполнение
        $sth = $dbh->prepare("INSERT INTO `{$table}` (`vote_id`, `date`, `ip`, `nick`, `votes`) VALUES (:vote_id, :date, :ip, :nick, :votes)");
        $sth1 = $dbh->prepare("UPDATE {$table2} SET vp = vp + :RewardCoins WHERE username = :nick AND not exists(select 1 from {$table} where vote_id = :vote_id AND date = :date AND nick = :nick AND votes = :votes)");

        while (($data = fgetcsv($fp, 1000, "\t")) !== false) {
            // если в строке не 5 элементов или ID уже есть, то пропускаем строку
            if (count($data) != 5 || $last_id >= $data[0]) continue;
             $fields = array(
                  ':vote_id' => $data[0],
                  ':date' => date('Y-m-d H:i:s', strtotime($data[1])),
                  ':nick' => $data[3],
                  ':votes' => $data[4],
                  ':RewardCoins' => ($data[4]==2 ? $vip_vote : $vote)
              );
              $sth1->execute($fields); // Обновляем VP
              $fields[':ip']=$data[2]; // Добавляем ip для следующего запроса
              unset($fields[':RewardCoins']); // А это поле удаляем, т.к. в следующем запросе его нет
              // сохраняем строку в таблицу
              if ($sth->execute($fields)) $rows ++;
              else var_dump($sth->errorInfo()); // Если у вас на соединении стоит выбрасывание исключения, то эта строка никогда не выполнится, т.к. при ошибке мы вылетим в блок catch
    }
    fclose($fp);
    echo "Добавлено {$rows} записей <br>";
} else {
    echo 'Ошибка открытия файла';
}
READ ALSO
Почему не происходит refresh?

Почему не происходит refresh?

По какой-то причине не происходит Resfresh страницы, но код правильно вставляется, куда надоПросто самого факта рефреша не происходит

150
В одномерном массиве размерности n найти МАКСИМАЛЬНОЕ значение из

В одномерном массиве размерности n найти МАКСИМАЛЬНОЕ значение из

МАКСИМАЛЬНОЕ значение из ( максимального значения первых 3 положительных чисел массива , минимальное значение из 2 последних элементов массива...

187
Почему один код выдает &ldquo;Значение типа char(*)[4] нельзя использовать для инициализации сущности типа char**&rdquo;, а другой работает?

Почему один код выдает “Значение типа char(*)[4] нельзя использовать для инициализации сущности типа char**”, а другой работает?

Вопрос такой, почему один код выдает "Значение типа char(*)[4] нельзя использовать для инициализации сущности типа char**"

174