2013-03-22 3 views
5

PHP PDO에서 가장 이상한 문제가 있습니다. 여러분이 저를 위해 그것을 해결할 수 있기를 바랍니다.LIMIT가 너무 높을 때 PHP의 PDO 쿼리가 실행되지 않습니까?

$checkLimit을 50000으로 설정하면 쿼리가 정상적으로 작동합니다. 중 (이미 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING)를 사용하여 그들을 고발했고 그것은 오류 메시지를 캐스팅하지 않습니다

$sql = " 
    SELECT d_domain_name AS domainName, d_domain_id AS domainID 
    FROM domains 
    ORDER BY d_domain_name_length ASC, d_domain_name ASC 
    LIMIT :checkLimit 
"; 
$stmt = $db->prepare($sql); 
$stmt->bindValue(':checkLimit', intval($checkLimit), PDO::PARAM_INT); 
$stmt->execute(); 
$results = $stmt->fetchAll(); 
foreach ($results as $result) { 
// 50k moments of magic 
} 

을 내가 실행하는 경우 - 나는 50K 이상 아무것도로 설정한다면, 그것은 어떤 결과를 반환하지 않습니다. PHP 외부의 쿼리, 어떤 제한 (심지어 500k, 약 3 분 걸립니다).

메모리를 시도하고 저장하기 위해 로 변경 시도했지만 불행히도 아무것도하지 않았다.

누구나 내가 잘못하고있는 것을 말할 수 있습니까? 내가 무엇을 놓치고 있습니까? 왜 제가 50k를 넘을 수 없습니까?

+0

'int'값이 무한대가 아니므로 한도를 초과했을 수 있습니다. – fedorqui

+2

그게 뭐야? 우리를 서스펜스에 빠뜨리지 마라! –

+0

@fedorqui : 50,000은 32bit PHP int –

답변

4

참조 : http://php.net/manual/en/mysqlinfo.concepts.buffering.php

PDO는 기본적으로 "버퍼링 된 쿼리"를 사용합니다.

즉, 쿼리 결과는 MySQL 서버에서 PHP로 즉시 전송되어 PHP 프로세스의 메모리에 저장됩니다. .... 버퍼 모드의 단점은 더 큰 결과 인 세트가 꽤 많은 메모리를 필요로한다는 것입니다. ....

이러한 특성에 따라 제한된 결과 집합 만 기대하거나 모든 행을 읽으려면 반환 된 행의 양을 알아야하는 경우 버퍼링 된 쿼리를 경우에 사용해야합니다. 더 큰 결과가 예상되는 경우 무 버퍼 모드 을 사용해야합니다.

50k는 큰 결과 집합입니다. 시도해 주시겠습니까 pdo는 버퍼링되지 않은 모드를 사용하자한 번에 한 행을 반입? 이것은 참조에서 복사 된 예제입니다. 두 번째 줄은 버퍼링되지 않은 모드를 설정합니다.

<?php 
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); 
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 

$uresult = $pdo->query("SELECT Name FROM City"); 
if ($uresult) { 
    while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { 
     echo $row['Name'] . PHP_EOL; 
    } 
} 
?> 
+0

멋지다. 흥미 롭다. – Sebas

+0

그것은 훌륭하게 작동한다 - 나는 쿼리 내에서 새로운 쿼리를 실행할 수 없다. '버퍼되지 않은 다른 쿼리가 활성화되어있을 때 쿼리를 실행할 수 없습니다. PDOStatement :: fetchAll()을 사용해보십시오.또는, mysql에 대해서만 코드가 실행되는 경우 PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY 속성을 설정하여 쿼리 버퍼링을 활성화 할 수 있습니다. ' –

+0

다른 버퍼링 된 쿼리에 대해 동일한 databasse에 대해 다른 pdo 연결을 열어 볼 수 있습니까? –

관련 문제