# Cannot fetch from database using if...else

**URL:** <https://www.ruby-forum.com/t/cannot-fetch-from-database-using-if-else/162850>\
**Category:** Ruby\
**Created:** [March 14, 2009, 2:31pm UTC](https://www.ruby-forum.com/t/cannot-fetch-from-database-using-if-else/162850 "2009-03-14T14:31:23Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![arunvoip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e8c25b/32.png) [@arunvoip](https://www.ruby-forum.com/u/arunvoip)\
**Post date:** [March 14, 2009, 2:31pm UTC](https://www.ruby-forum.com/t/cannot-fetch-from-database-using-if-else/162850/1 "2009-03-14T14:31:23Z")

</div>

Hi,  
I’m new to ruby and right now i’m trying out some examples involving  
database access using the dbi module. This is my code…

#!/usr/local/bin/ruby -w

require ‘dbi’

begin  
con = DBI.connect(“DBI:Mysql:Sample:localhost”, “arunkumar”, “123456”)  
stats = con.prepare(“Select \* from hello where first\_name = ?”)  
stats.execute(‘arun’)  
if stats.fetch == nil  
puts “No Records”  
con.rollback  
else  
puts stats.fetch  
end  
rescue DBI::DatabaseError =\> e  
puts “Error: #{e.errstr}”  
ensure  
con.disconnect if con  
end

If I use ‘puts stats.fetch’ before if the fetched data is displayed  
properly. But if i use ‘puts stats.fetch’ inside if or else ‘nil’ will  
be displayed even if there are matching records in the database. I dont  
know why. Can anybody help me???

Regards  
Arun K.

---

<div class="post-metadata">

**Author:** ![arunvoip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e8c25b/32.png) [@arunvoip](https://www.ruby-forum.com/u/arunvoip)\
**Post date:** [March 14, 2009, 2:49pm UTC](https://www.ruby-forum.com/t/cannot-fetch-from-database-using-if-else/162850/2 "2009-03-14T14:49:25Z")

</div>

From the API doc:  
fetch():  
Fetch the next row in the result set. DBD Required.

So someone will correct me if I’m wrong but I think you cannot evaluate  
fetch in a condition and call it in the condition itself because it will  
refer to the next row in the result set, probably nil in your case  
because there is only one row.

Luc

Arun K. a Ã©crit :

---

<div class="post-metadata">

**Author:** ![arunvoip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e8c25b/32.png) [@arunvoip](https://www.ruby-forum.com/u/arunvoip)\
**Post date:** [March 14, 2009, 6:26pm UTC](https://www.ruby-forum.com/t/cannot-fetch-from-database-using-if-else/162850/3 "2009-03-14T18:26:53Z")

</div>

On Sat, Mar 14, 2009 at 6:29 AM, Arun K.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> stats = con.prepare(“Select \* from hello where first\_name = ?”)  
> Â Â con.disconnect if con  
> end
> 
> If I use ‘puts stats.fetch’ before if the fetched data is displayed  
> properly. But if i use ‘puts stats.fetch’ inside if or else ‘nil’ will  
> be displayed even if there are matching records in the database. I dont  
> know why. Can anybody help me???

Since stats.fetch is a method call, and you want to output the same  
result you are testing, not call the method again and output whatever  
it would return the second time if it is not nil the first time, you  
probably want to replace the if…else…end structure with something  
like this:

if (result = stats.fetch) == nil  
puts “No Records”  
con.rollback  
else  
puts result  
end

Since “nil” is the only result that is false in a boolean context that  
fetch will return, you don’t really need a comparison to nil:

if (result = stats.fetch)  
puts “No Records”  
con.rollback  
else  
puts result  
end
