2016-08-02 4 views
-3

Этот скрипт работает очень медленно, когда я пытаюсь его в Google Chrome с URL сценария, и я хотел бы знать, почему:Почему этот скрипт работает так медленно (Simple выберите)

<?php 

    include 'config.php'; 

    $conn = mysqli_connect($servername, $username, $password, $dbname); 

    $playerEmail = $_REQUEST["playerEmail"]; 

    $sql = "SELECT * 
     FROM players 
     WHERE EMAIL = '$playerEmail'"; 

    $res = mysqli_query($conn,$sql); 

    $result = array(); 

    while($row = mysqli_fetch_array($res)){ 
     array_push($result, 
     array('EMAIL'=>$row[0], 
       'DATEOFSIGNUP'=>$row[2], 
       'USERNAME'=>$row[3], 
       'GENDER'=>$row[4], 
       'JOB'=>$row[5], 
       'LVL'=>$row[6], 
       'HP_NOW'=>$row[7], 
       'HP_MAX'=>$row[8], 
       'MANA_NOW'=>$row[9], 
       'MANA_MAX'=>$row[10], 
       'STR'=>$row[11], 
       'SPD'=>$row[12], 
       'INTEL'=>$row[13], 
       'XP_NOW'=>$row[14], 
       'XP_NEEDED'=>$row[15], 
       'GOLDS'=>$row[16], 
       'NUMBERSOFITEMS'=>$row[17], 
       'LOCATION_X'=>$row[18], 
       'LOCATION_Y'=>$row[19] 
      )); 
    } 

    echo json_encode(array("result"=>$result)); 

    mysqli_close($conn); 

?> 

Все мои другие скрипты были сделаны с использованием $ _REQUEST, поэтому я не верю, что это причина. Все, что вы можете придумать, не стесняйтесь делиться здесь.

Спасибо, много людей!

+0

Какой раздел работает медленно? Вы проводили бенчмаркинг? – MonkeyZeus

+0

Примерно, сколько строк возвращает ваш запрос? –

+1

Это кажется слишком сложным; почему бы просто не вернуть ассоциативный массив из базы данных? Если вы использовали PDO, вы даже можете использовать 'fetchAll', чтобы полностью отказаться от цикла. – miken32

ответ

2

Ответ создать индекс на столбце E-MAIL является правильным, но в будущем здесь более быстрый, безопасный способ закодировать это с PDO:

<?php 

include 'config.php'; 

try { 
    $pdo = new PDO("mysql:host=$servername;dbname=$dbname", 
     $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); 
} catch (PDOException $e) { 
    error_log("PDO connection failed in " . __FILE__ . 
     ", Error: " . $e->getMessage()); 
    die("Database error, please contact administrator"); 
} 

$playerEmail = $_REQUEST["playerEmail"]; 

$sql = "SELECT EMAIL, DATEOFSIGNUP, USERNAME, GENDER, 
      JOB, LVL, HP_NOW, HP_MAX, MANA_NOW, MANA_MAX, 
      STR, SPD, INTEL, XP_NOW, XP_NEEDED, GOLDS, 
      NUMBERSOFITEMS, LOCATION_X, LOCATION_Y 
    FROM players 
    WHERE EMAIL = ?"; 

$stmt = $pdo->prepare($sql); 
$stmt->execute([$playerEmail]); 

$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

echo json_encode(array("result"=>$result)); 
3

Для того, чтобы ускорить скорость, вам необходимо указать индекс om you EMAIL.

$sql = "SELECT * 
    FROM players 
    WHERE EMAIL = '$playerEmail'"; 

Создать индекс:

CREATE INDEX idx_nn_1 ON players(EMAIL); 

Поскольку ваш код открыт для кого с помощью инъекции SQL идти и читать на инъекции SQL и PHP PDO. Ваш код даже для SQL-инъекций является одним из самых простых для взлома (так что действительно сделайте этот код лучше или у вас проблемы).

+2

* Я могу сделать это за вас * Приятно предупреждать пользователей о рисках безопасности, но предлагать их использовать не является конструктивным. –

+1

@ A.L Используя некоторый юмор, чтобы получить точку через ... –

+3

@NorbertvanNobelen, +1 для рекомендации по индексу. Я также предупреждаю людей о рисках безопасности, и я поддерживаю использование юмора, но * иронию * часто трудно распознать читателей в текстовом носителе. –

Смежные вопросы