Mssql sql sorgu içinde sorgu

Başlatan karabilal, 18 Mart 2011 - 16:24:52

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

karabilal

odbc_exec() ile sorgu yapıyorum sorgudan dönen sonçlar while döngüsü içinde iken bir tane daha mssql sorgusu yapıyorum ama aşağıdaki hatayı alıyorum. Bunun çözümü nasıl olur?

[unixODBC][FreeTDS][SQL Server]Invalid cursor state


Konuyu biraz daha açıyorum

$sorgu1 = odbc_exec($sqlbaglan, "SELECT * FROM uyeler");
while($list1 = odbc_fetch_array($sorgu1))
{
           $id = $list1['id'];
      echo odbc_errormsg();

      $sorgu2 = odbc_exec($sqlbaglan, "SELECT * FROM adresler");
      while($list2 = odbc_fetch_array($sorgu2))
      {
                $id2 = $list2['id'];
      }
}

yukarıdaki kodu çalıştırdığımda
[unixODBC][FreeTDS][SQL Server]Invalid cursor state
yukarıdaki hatayı aluıyorum. Çünkü döngü içinde döngü kullandığımda bu hatayı veriyor. Easy Php ile yapıyorum bir sorun yok ama ubuntu serverda çalıştıırdığım zaman hatayı veriyor. Yani kodlar çalışıyor. Bu konuda yardımcı olur musuunuz?

risperdal

$id2 = $list1['id'];

$list1 in $list2 olması gerekiyor. Sorun buradan kaynaklanıyor olabilir mi ?

Bu arada odbc_fetch_array yerine odbc_fetch_result ile yapsan while kullanmana gerek kalmaz.

http://php.net/manual/en/function.odbc-result.php

karabilal

burada yanlış yazmışım normalde list2 olarak çekiyorum. Dediğinizi bir araştırayım ama çözüm getireceğini sanmıyorum tabi araştıracağım.

karabilal

Hocam odbc_results'uda yaptım ama olmadı. Sizce bunun çözümü nedir? Ben çözemedim. Sanırım 1'inci sorgu bitmeden yani birinci sorgunun içindeki while döngüsü bitmeden diğerine geçmiyor ve işlemleri yapmıyor. Windows ortamında Easy Php ile denediğimde oluyor. Sizce ama ubunutu sunucumda olmuyor. Bu konuda yardımcı olur musunuz?

guestwho

    İçerideki (2.) döngü yorumlanırken muhtemelen veritabanı sunucusu arkaplanda başka bir iş parçacığı (thread) daha başlatmaya çalışıyor, zira ayriyeten 2. tablo üzerinden ("adresler") sorgu yürütmeye çalışıyorsun. Bu durumda akla şu soru geliyor: "unixODBC" sürücüsünün kullandığı "FreeTDS protokolü" çoklu iş parçacıklarını destekliyor mu ? Başka bir deyişle "thread-safe" mi ? Destekliyorsa dahi, bunun için ayriyeten ayar dosyalarında (".ini" ya da hangi ayar dosyası formatını kullanıyorsa artık) değişikliğe gitmen gerekiyor mu ? Bunları araştırmalısın... Hatta belki şuradakine benzer bir kod bloğu çoklu tablo sorgulamalarında bu sorunun etrafından dolaşmanı sağlayabilir:

http://dba.fyicenter.com/faq/sql_server_2/PHP_ODBC_Query_Multiple_Tables_Jointly.html
You want weapons? We're in a library. Books are the best weapon in the world. This room's the greatest arsenal we could have. Arm yourself!

sem

PHP çok bilmiyorum fakat;

Burada list2 sorgusu sabit. Dolayısı ile id2 de sabit olmuş oluyor.

id2 değeri sanırım "adresler" tablosunun daima en son ID değerini alıyor. Bu durumda içteki while'ı her defasında döndürmek manalı mıdır? Yoksa ben yanlış mı anladım olayı...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

karabilal

Hocam sanırım çoklu sorgulamara açık değil çünkü EASY PHP ile çoklu sorgu yapabilirim yani yukarıdaki kod parçası çalışıyor  ve sonuçları görebiliyorum ama UBUNUTU sunucumda çalışmıyor çünkü bir tane kod parçasını okuyor. Acaba çoklu sorguyu nasıl açabilirim bu konuda yardımcı olabilecek var mıdır?
<?php
$sorgu1 
odbc_exec($sqlbaglan"SELECT * FROM uyeler");
while(
$list1 odbc_fetch_array($sorgu1))
{
           
$id $list1['id'];
      echo 
odbc_errormsg();

      
$sorgu2 odbc_exec($sqlbaglan"SELECT * FROM adresler WHERE id='$id'");
      while(
$list2 odbc_fetch_array($sorgu2))
      {
                
$id2 $list2['id'];
      }

?>


kod parçası örneğide yukarıdaki gibidir.

karabilal

Bu konuca yardımcı olabilecek birisi var mı? Rica etsem.

guestwho

    @karabilal, bağlantıdaki PHP kodunu kendi ihtiyacına göre uyarlamayı denedin mi ?
You want weapons? We're in a library. Books are the best weapon in the world. This room's the greatest arsenal we could have. Arm yourself!

karabilal

 :o Hocam kodları kendime göre düzenliyorum. Şöyleki EASYPHp programı ilewindows ortamında yaptığıms ayfa çalışıyor. Ama sunucuya attığımda çalışmıypr. Sanırım while döngüsü içinde while olduğundan sunucu bunu çalıştırmıyor. Ama windows ortamında EASY PHP ile yaptığımda çalışıyor. Hiç bir hatada almıyorum.

guestwho

    @karabilal, sanırım yukarıda verdiğim bağlantıdaki kodlara henüz göz atmadın, "kendine göre uyarlaman gereken kodları" buraya aktarıyorum başka türlü olmayacak:

<?php
  $con 
odbc_connect('FYI_SQL_SERVER','sa','FYIcenter');

  
$userID 101;
  
$sql "SELECT posts.subject, posts.time, users.name,"
    
" forums.title"
    
" FROM posts, users, forums"
    
" WHERE posts.userID = ".$userID
    
" AND posts.userID = users.id"
    
" AND posts.forumID = forums.id";
  
$res odbc_exec($con$sql);
  while (
$row odbc_fetch_array($res)) {
    print(
$row['subject'].", ".$row['time'].", "
      
.$row['name'].", ".$row['title']."\n");
  }  
  
odbc_free_result($res);

  
odbc_close($con);
?>


    Kodlara yeterince yakından bakarsan, ikinci while döngüsünün niçin gereksiz olduğunu anlarsın.
You want weapons? We're in a library. Books are the best weapon in the world. This room's the greatest arsenal we could have. Arm yourself!

karabilal

hocam kodlara baktımda ben yeri geliyor while döngülerini iç içe 4-5 kere kullanıyorum ve 10'larca sayfam var EASYPHP ile çalışan ama ubuntuya atınc olmuyor. Bu konuda gerçekten yardıma ihtiyacım var.