2016-08-02 138 views
-3

這個腳本運行真的比較慢,當我嘗試在谷歌與腳本URL鉻,我想知道爲什麼:這是爲什麼PHP腳本運行很慢(簡單的SELECT)

<?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

答案您的電子郵件列上創建索引是正確的,但以供將來參考這裏與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 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的索引建議。我也支持警告人們有關安全風險,我支持使用幽默,但*反諷*往往很難讓讀者在純文本媒體中識別。 –