如何检查数据库查询是否会返回结果?
我们的网站使用 Perl 为我们的人力资源人员提供一个简单的机制来将职位空缺发布到我们的网站。 它是由第三方开发的,但他们早已开始接触,遗憾的是我们内部没有任何 Perl 技能。 当营销人员规避其内部 IT 团队时就会发生这种情况!
我需要对此应用程序进行简单的更改。 目前,无论是否有空缺,职位空缺页面都会显示“我们目前有以下空缺职位:”! 所以我们要更改它,以便该行仅在适当的时间显示。
显然,我可以开始学习一些 Perl,但我们已经在计划一个替代站点,而且它肯定不会使用 Perl。 因此,由于解决方案对于具有这些技能的人来说是微不足道的,所以我想我应该寻求一些有针对性的帮助。
以下是列出职位空缺的程序的开始。
sub list {
require HTTP::Date;
import HTTP::Date;
my $date = [split /\s+/, HTTP::Date::time2iso(time())]->[0];
my $dbh = DBI->connect($dsn, $user, $password)
|| die "cannot connect to $database: $!\n";
my $sql = <<EOSQL;
SELECT * FROM $table where expiry >= '$date' order by expiry
EOSQL
my $sth = $dbh->prepare($sql);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
my $temp = $template;
$temp =~ s#__TITLE__#$ref->{'title'}#;
my $job_spec = $ref->{'job_spec'};
...etc...
关键行是 while (my $ref = $sth->fetchrow_hashref()) {。 我认为这是在说“虽然我可以从返回的记录集中找到另一个空缺......”。 如果我将打印语句放在该行之前,它将始终显示; 在此行之后,对于每个空缺都重复该行。
如何确定有一些空缺要显示,而不过早地遍历返回的记录集?
我总是可以在 while 循环中复制代码,并将其放在 if() 语句中(在 while 循环之前),该语句也将包含我的 print 语句。 但我更愿意采用更简单的方法 如果有任何记录,则打印“我们当前有..”行
。 不幸的是,即使是这一行简单的代码我也没有任何线索。
看,我告诉过你这是一个微不足道的问题,即使考虑到我笨手笨脚的解释!
蒂亚·
克里斯
Our website uses Perl to provide a simple mechanism for our HR people to post vacancies to our website. It was developed by a third party, but they have been long since kicked into touch, and sadly we do not have any Perl skills in-house. This is what happens when Marketing people circumvent their in-house IT team!
I need to make a simple change to this application. Currently, the vacancies page says 'We currently have the following vacancies:', regardless of whether there are any vacancies! So we want to change it so that this line is only displayed at the appropriate times.
I could, obviously, start to learn a bit of Perl, but we are already planning a replacement site, and it certainly won't be using Perl. So since the solution will be trivial for those with these skills, I thought I'd ask for some focused help.
Below is the start of the procedure that lists the vacancies.
sub list {
require HTTP::Date;
import HTTP::Date;
my $date = [split /\s+/, HTTP::Date::time2iso(time())]->[0];
my $dbh = DBI->connect($dsn, $user, $password)
|| die "cannot connect to $database: $!\n";
my $sql = <<EOSQL;
SELECT * FROM $table where expiry >= '$date' order by expiry
EOSQL
my $sth = $dbh->prepare($sql);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
my $temp = $template;
$temp =~ s#__TITLE__#$ref->{'title'}#;
my $job_spec = $ref->{'job_spec'};
...etc...
The key line is while (my $ref = $sth->fetchrow_hashref()) {
. I'm figuring that this is saying 'while I can pull off another vacancy from the returned recordset...'. If I place my print statement before this line, it will always be shown; after this line and it was be repeated for every vacancy.
How do I determine that there are some vacancies to be displayed, without prematurely moving through the returned recordset?
I could always copy the code within the while loop, and place it within an if() statement (preceding the while loop) which will also include my print statement. But I'd prefer to just have the simpler approach of If any records then print "We currently have.." line
. Unfortunately, I haven't a clue to code even this simple line.
See, I told you it was a trivial problem, even considering my fumbled explanation!
TIA
Chris
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
一个非常简单的方法是:
A really simple way would be:
如果您使用的是 Mysql,“rows”方法就可以正常工作:
该方法和一些注意事项在“perldoc DBI”中进行了详细记录。 始终以“perldoc”开头。
If you are using Mysql, the "rows" method works just fine:
The method, and some caveats, are documented in extensive detail in "perldoc DBI". Always start with "perldoc".
这与其说是一个 Perl 问题,不如说是一个数据库问题,在获得结果之前,没有什么好方法可以知道有多少结果。 这里有两个选择:
例如,在我的脑海中:
This isn't so much a Perl question as it's a database question, and there is no good way to know how many results you have until you have them. You've got two choices here:
For example, off the top of my head:
由于每个人都希望优化 Graeme 解决方案中是否已打印标题的重复测试,因此我对此提出了这个微小的变化:
Since everyone wants to optimize away the repeated tests for whether the header has been printed in Graeme's solution, I present this minor variation on it:
由于您的查询是SELECT,因此您无法利用行或执行本身。
但是,您可以通过添加另一个查询来预先计算您的查询将选择多少行(即空缺)...类似这样:
或者类似地,而不是“准备”和“执行”查询,然后使用“fetchrow_array”,您可以使用selectrow_array:
对于 selectall_arrayref:
但是,如果您使用 selectrow_array 或 selectall_arrayref ,您还可以直接从原始查询结果中检索职位空缺数量:
Since your query is a SELECT, you cannot take advantage of rows or of the value returned by the execute itself.
However, you can pre-count how many rows (i.e. vacancies) your query will select by adding another query... something like this:
Or, similarly, instead of "prepare" and "execute" the query and then use "fetchrow_array", you can do everything in a single call using selectrow_array:
And the same is also true for selectall_arrayref:
However, if you use selectrow_array or selectall_arrayref, you can also retrieve the number of vacancies directly from the result of the original query:
更有效的方法(避免循环内的条件),如果您不介意它稍微改变页面的输出方式(一次全部而不是一次一行),您可以创建一个变量来保存在循环之前输出:
然后在循环内,将任何打印语句更改为如下所示:
然后在循环之后:
A bit more efficient way (avoiding a conditional inside the loop), if you don't mind it changing the way the page is output a bit (all at once rather than a row at a time) you could make a variable to hold the output just before the loop:
and then inside the loop, change any print statement to look like this:
then after the loop:
只需添加另一个查询..像这样:
Just add another query.. something like this:
perldoc DBI 说:
所以答案是检查 $sth->execute() 的返回值:
Says perldoc DBI:
So the answer is to check the return value of $sth->execute():