2016-08-02 3 views
-3

이 스크립트는 내가 구글에서 그것을 시도 할 때 천천히 스크립트 URL과 크롬 정말 실행되고, 내가 알고 싶습니다 (일부 단순) 느린 이유 :왜이 PHP 스크립트가 실행되고

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

속도를 높이려면 인덱스 EMAIL 열이 있어야합니다.

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

는 인덱스를 만듭니다
CREATE INDEX idx_nn_1 ON players(EMAIL); 

코드 가서 SQL 주입 및 PHP PDO에 읽어 SQL 주입을 사용하는 사람에게 열려 있기 때문에

. 당신의 코드는 심지어 SQL 주입을위한 것 중 가장 쉬운 것 중 하나입니다 (그래서이 코드를 더 좋게 만들거나 곤란한 상황에 처하게됩니다).

+2

* 내가 할 수있는 일 * 보안 위험에 대해 사용자에게 경고하는 것은 좋지만 사용을 제안하는 것은 건설적인 것이 아닙니다. –

+1

@ A.L 몇 가지 유머를 사용하여 .... .... –

+3

@NorbertvanNobelen, 인덱스 추천 +1. 또한 사람들에게 보안 위험에 대해 경고하고 유머를 사용하는 것을지지하지만, 아이러니 *는 독자가 텍스트 전용 매체에서 인식하기가 어렵습니다. –

관련 문제