2016-01-19 2 views
3

Я использую этот код, чтобы проверить, действительно ли запись уже существует, но кажется, что запрос всегда возвращает true. Когда я использую тот же запрос в оболочке, он работает правильно. Имейте в виду, что foodname является Первичным ключом.EXISTS всегда возвращает истинный простой запрос

$query = "SELECT EXISTS (SELECT * FROM Food WHERE foodname = '$food_name')"; 
    $result = pg_query($conn,$query) or die("Query could not be executed"); 
    if($result) 
    { 
     echo 'food already exists: '; 
     echo $food_name; 
     printf("\n"); 
    } 
    else 
    { 
     echo 'new food inserted'; 
     printf("\n"); 
     $query = "INSERT INTO food VALUES ('$food_name','$food_price','$food_date')"; 
     $result = pg_query($conn,$query) or die("Query could not be executed"); 
    } 

ВОПРОС: Я изменил его «скачать скачать» сказал так же, как и он работает, как он также работает с Kettners ответ, но не СУЩЕСТВУЕТ быстрее для проверки, если запись уже существует по той причине, что он останавливается, когда его находит пару? Есть ли какой-либо запрос с использованием EXISTS, который может работать в этом случае? Thnx за помощь.

ANSWER: После прочтения всего, что вы, ребята, сказали следующее, что я выбрал для использования, он работает и также использует EXISTS.

$query = "SELECT 1 FROM food WHERE EXISTS (SELECT * FROM Food WHERE foodname = '$food_name')"; 
     $result = pg_query($conn,$query) or die("Query could not be executed"); 
     $row = pg_fetch_row($result); 
     if($row[0]) 
     { 
      echo 'food already exists: '; 
      echo $food_name; 
      printf("\n"); 
     } 
     else 
     { 
      echo 'new food inserted'; 
      printf("\n"); 
      $query = "INSERT INTO food VALUES ('$food_name','$food_price','$food_date')"; 
      $result = pg_query($conn,$query) or die("Query could not be executed"); 
     } 
+0

посмотреть на http://stackoverflow.com/questions/7471625/fastest-check-if-row-exists-in-postgresql –

+0

Сначала проверить, что вывод идет в $ результат. если запрос работает успешно или сбой – Monty

+0

Вы пробовали SELECT EXISTS (SELECT 1 FROM Food WHERE foodname = '$ food_name') ;? –

ответ

1

Просто попробуйте это:

$query="SELECT * FROM Food WHERE foodname = '$food_name'"; 
    $result = pg_query($conn,$query) or die("Query could not be executed"); 

    if(pg_num_rows($result)>=1){ 
    echo 'food already exists: '; 
    echo $food_name; 
    printf("\n"); 
    } 
else{ 
     echo 'new food inserted'; 
     printf("\n"); 
     $query = "INSERT INTO food VALUES ('$food_name','$food_price','$food_date')"; 
     $result = pg_query($conn,$query) or die("Query could not be executed"); 
} 
+0

То, что я тоже пробовал, и это работает, но мои вопросы о EXISTS и почему $ result получает идентификатор ресурса #number, поскольку вход из pg_query() все еще остается. –

+0

потому что это условие 'if ($ result)' is 'TRUE' –

1

База данных: PostgreSQL
Запрос: дает результат на успех т и при неудаче е
Тип: булево.

Вы должны изменить свое состояние.

if($result == 't'){ 
    // Your code here 
}else { 
    // Your code here 
} 

Modified:

$result = pg_query($conn, "Your Query"); 
$rows = pg_num_rows($result); 
if($rows != -1){ 
    // Success 
}else { 
    // Fail 
} 
+0

pg_query возвращает boolean как результат. Так что если ($ result) или if (! $ Result), то оба правильны. –

+0

да я знаю @RaviHirani. – Monty

+0

Strangelly ($ result == 't') имеет другой результат ($ result) или ($ result == true) no. Я изменил его на 't', и теперь проблема заключается в том, что он идет внутри else, а $ result = true. –

1

pg_query возвращает ресурс результата. Вы можете запросить этот источник с помощью pg_fetch_row, чтобы получить данные.

pg_query возвращает FALSE только в том случае, если утверждение не выполнено. Однако ваше утверждение никогда не перестает работать (если вы можете получить доступ к базе данных и таблице должным образом). Он запускается и возвращает значение (TRUE или FALSE).

Следовательно, if($result) всегда возвращает true и не дает вам никакой информации о результатах запроса.

Это должно сработать: выполнить запрос, извлечь первую строку, проверить ее первый (и только) столбец.

$query = "SELECT EXISTS (SELECT * FROM Food WHERE foodname = '$food_name')"; 
$result = pg_query($conn,$query) or die("Query could not be executed"); 
$row = pg_fetch_row($result); 
if($row[0]) 
{ 
    echo 'food already exists: '; 
    echo $food_name; 
    printf("\n"); 
} 
else 
{ 
    echo 'new food inserted'; 
    printf("\n"); 
    $query = "INSERT INTO food VALUES ('$food_name','$food_price','$food_date')"; 
    $result = pg_query($conn,$query) or die("Query could not be executed"); 
} 
+0

Thnx для информации. Я тоже пробовал это, но снова он всегда идет внутрь, если. –

+0

Прошу прощения, что я уже вставлял данные в запрос, собираюсь удалить и проверить, потому что это немного отличается от того, что я пытался. –

+0

Да, это работает, но не более ли больно «больно» по сравнению с EXISTS, потому что EXISTS останавливает поиск, если находит пару? –

Смежные вопросы