2013-03-16 2 views
0

У меня есть следующий код, который работает для меня так, как должен, за исключением того, что требуется много времени, прежде чем запросы будут выполнены? как я могу сделать это быстрее? Кажется, что за 2 записи требуется около 1 - 2 минут.php sql while very slow

$query2 = "SELECT COUNT(*) FROM preordertablet1"; 
$result = mysql_query($query2) or die(mysql_error()); 
$count = mysql_fetch_row($result); 
//$result=mysql_query($query) or die ("Gegevens niet kunnen ophalen uit preorder tabel. Foutmelding: ".mysql_error()); 
$c=0; 
while ($c<=$count) 
    { 
    $query="SELECT * FROM preordertablet1 WHERE ID = '$c'"; 
    $result=mysql_query($query) or die ("gegevens niet geladen uit de preordertabel, fout: ".mysql_error()); 
    while ($row=mysql_fetch_array($result)) 
     { 
     $ID1=$ID1+1; 
     $c++; 
     $naam=$row['naam']; 
     $Postcodehuisnummer=$row['Postcodehuisnummer']; 
     $datum=$row['datum']; 
     $dagen=$row['dagen']; 
     $productid=$row['productid']; 
     $subid=$row['subid']; 
     //$ID2=$ID1; 
     //gegevens in database plaatsen 
     $result=mysql_query("INSERT INTO huur (ID, ID2, status, naam, Postcodehuisnummer, datum, dagen, productid, subid) VALUES ('$ID1', '$ID2', '1', '$naam', '$postcodehuisnummer', '$huurdatum', '$aantaldagen', '$productid', '$subid')") or die ("Fout: ".mysql_error()); 
     echo 'preorder fiets toegevoegd met ID2: ', $ID2,'<br>'; 
     //$ID1=$ID1+1; 
     } 
    } 
+4

[** Пожалуйста, не используйте 'mysql_ *' функции новый код **] (http://bit.ly/phpmsql). Они больше не поддерживаются [и официально устарели] (http://j.mp/XqV7Lp). См. [** красное поле **] (http://j.mp/Te9zIL)? Узнайте о [* подготовленных операторах *] (http://j.mp/T9hLWi) и используйте [PDO] (http://php.net/pdo) или [MySQLi] (http://php.net/ mysqli) - [эта статья] (http://j.mp/QEx8IB) поможет вам решить, какой из них. Если вы выберете PDO, [здесь хороший учебник] (http://j.mp/PoWehJ). –

+0

Определите «долгое время». Сколько у вас записей? –

+0

всего 2 записи, занимает около 1 или 2 минуты, кажется? – user2133342

ответ

0

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

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

Тогда в первом цикле есть запрос, скорее всего, часть WHERE ID = '$ c', из-за чего вы получаете только одну вставленную строку. Если столбец идентификатора является первичным ключом auto_increment, первая вставленная строка будет иметь значение не менее 1, но первая проверка, которую вы выполняете, - это идентификатор = 0, который ничего не возвращает. Последняя итерация таблицы с двумя строками будет поэтому для идентификатора 1, но нет никакой гарантии, что есть какая-либо строка с этим идентификатором, но в вашем случае есть один, и я предполагаю, что это строка, которую вы видите в ваш результат.

Я не собираюсь предлагать исправления для второго цикла while без дополнительной информации о столбцах, таких как ID1 и ID2. Может быть, вы могли бы опубликовать определения таблиц (создать структуру таблицы) и объяснить немного дальше?

Как говорили другие, не используйте функции mysql_, они могут исчезать из PHP в любое время, поскольку они устарели.

Все это, конечно, основано на угадывании таблиц, поскольку вы не разместили макет таблицы или то, что вы пытаетесь достичь.

Чтобы получить вам немного по дороге вот простой фрагмент кода, это не полный, но должно дать вам идею, read about PDO here

$pdo = new PDO(<insert your connection information here>); 
$selectStmt = $pdo->query('SELECT * FROM preordertablet1'); 
$insertStmt = $pdo->prepare("INSERT INTO huur 
    (ID, ID2, status, naam, Postcodehuisnummer, datum, dagen, productid, subid) 
    VALUES 
    (:ID1, :ID2, '1', :naam, :postcode, :datum, :dagen, :productid, :subid)"); 
$ID1 = 0; // Or whatever starting value you're working from. 

while ($row = $selectStmt->fetch(PDO::FETCH_ASSOC)) { 
    $ID1++; 
    $values = array("ID1" => $ID1, "ID2" => NULL, "naam" => $row['naam'], etc... 
    $insertStmt->execute($values); 
} 
+1

спасибо! теперь он работает – user2133342

0

$result переменного быть повторно использован для операции вставки. Затем значение $result проверяется в цикле while.

$result_insert = mysql_query("INSERT INTO huur etc etc") 
+0

его не большой стол на данный момент. просто тестирование и в настоящее время состоит всего из 2 записей – user2133342

+0

Должно ли условие цикла быть $ c <$ count? – suspectus

+0

Я просто хотел получить все записи строк из таблицы, но когда я использую SELECT * FROM preordertablet1, он возвращает только 1 запись, а не обе записи. он должен возвращать оба (с ID 0 и 1) – user2133342