Как получить с помощью fetch () те же результаты, что и с fetchAll ()? - PullRequest
0 голосов
/ 14 мая 2018

Я выбираю данные из базы данных mySQL с помощью fetchAll:

 $sql = "SELECT id, dateTime, fileName, path, size FROM files WHERE project = ?"; 
 $q = $pdo->prepare($sql);
 $q->execute([$id]);
 $result = $q->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC);

Массив выглядит следующим образом:

array(2) {
  ["10002E41F35560F492298F50D14B03A1"]=>
  array(5) {
    ["dateTime"]=>
    string(19) "2016-10-12 19:46:25"
    ["fileName"]=>
    string(10) "monkey.jpg"
    ["path"]=>
    string(59) "Volumes/KFS18050001/18050001/elephant/cat/monkey/monkey.jpg"
    ["size"]=>
    string(7) "8650752"
  }
  ["10008A76CEE6BEEEB8000891094A2931"]=>
  array(5) {
    ["dateTime"]=>
    string(19) "2016-10-12 14:39:43"
    ["fileName"]=>
    string(9) "horse.jpg"
    ["path"]=>
    string(51) "Volumes/KFS18050001/18050001/elephant/cat/horse.jpg"
    ["size"]=>
    string(7) "8306688"
  }
}

Но когда в моей базе данных содержится более 500 000 записейтогда это слишком много для системы.Массив не создан.Он загружается очень долго, а затем я получаю пустую страницуЯ пытался использовать fetch вместо fetchAll:

 $sql = "SELECT id, dateTime, fileName, path, size FROM files WHERE project = ?"; 
 $q = $pdo->prepare($sql);
 $q->execute([$id]);
 $result = $q->fetch(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC);

С fetch моя система может обрабатывать 500 000 записей.Но сейчас я не получаю нужный мне результат:

array(6) {
  ["id"]=>
  string(32) "10002E41F35560F492298F50D14B03A1"
  ["dateTime"]=>
  string(19) "2016-10-12 19:46:25"
  ["fileName"]=>
  string(10) "monkey.jpg"
  ["path"]=>
  string(59) "Volumes/KFS18050001/18050001/elephant/cat/monkey/monkey.jpg"
  ["size"]=>
  string(7) "8650752"
}

horse.jpg просто не отображается.И идентификатор теперь не является ключом массива.

Есть ли способ получить тот же результат, чем при fetchAll, используя fetch, или есть способ не перегружать систему при помощи fetchAll а много записей?

1 Ответ

0 голосов
/ 14 мая 2018

Поскольку я очень сомневаюсь, что вам нужно загрузить 500 000 изображений одновременно, я советую вам попробовать следующее:

Я бы продолжил использовать fetchall (), но только выбирал результаты из базы данных, которую вы в данный момент используете.необходимость.Если вам нужно загрузить все изображения, скажем, если вы создаете программу типа Instagram, я предлагаю вам динамически загружать изображения и, прокручивая страницу вниз, запрашивать базу данных каждые несколько сотен изображений.

Вы можете сделать это с помощью limit в mysql:

SELECT ....query here.... LIMIT 0,100

и после того, как ваш пользователь прокрутит, скажем, до 80 изображений, запросите базу данных еще раз:

 SELECT ....query here.... LIMIT 100,199

Thisтаким образом, вы не будете перегружать ни базу данных, ни систему клиента слишком большим количеством результатов.

...