【问题标题】:MySQL Select Count on VARCHAR in PERLMySQL 选择计数在 PERL 中的 VARCHAR
【发布时间】:2016-07-19 14:51:41
【问题描述】:

我有一个简单的 SELECT 语句:

$sql = "SELECT count(*) FROM member_temp WHERE member_Id = '".trim($id)."'";

member_Id 列是 VARCHAR(25) NOT NULL

这可以正常工作,直到 SELECT 到达具有 alpha 值的 member_Id,例如 1126A。然后它抛出错误

无法准备 SQL 语句:SELECT count(*) FROM member_temp WHERE member_Id = '1126A'

作为测试,我删除了这条记录,并且 SELECT 运行良好,直到下一个带有 A 的值。

如何使该查询运行并处理带有字母字符的记录?

这是删除主成员表中未找到的记录的较大代码块的一部分:

while ( @data = $sth->fetchrow_array() ) {

    my $id = $data[2];
    my $pk = $data[0];

    $sql = "SELECT count(*) FROM member_temp WHERE member_Id = '" . trim($id) . "'";
    #print "$sql\n";

    my $xth = $dbh->prepare($sql);
    $xth->execute();

    $cRows = $xth->fetchrow_array() || die "Could not prepare SQL statement:$sql";
    #print "$cRows\n";

    if ( $cRows == 0 ) {
        $sql = "DELETE FROM member WHERE sys_Id = " . $pk;
        $xth = $dbh->prepare($sql);
        $xth->execute();
        $cnt_del++;
    }

【问题讨论】:

  • 尝试直接在SQL中执行查询并给出响应
  • 这不是真正准备查询的方法;我们可以看看你的代码吗?这根本不应该引起任何问题。问题出在其他地方
  • 成功完成,返回值为0
  • 添加了代码块@HankyPanky

标签: mysql perl cgi


【解决方案1】:

好的,这是 Perl 的答案 :)

您的查询没有任何问题(除了它没有正确准备语句并且您正在使用字符串插值)。

在你说的cmets中如果直接运行这个查询

成功完成,返回值0

那么在你的代码中你有一个错误的条件

$cRows = $xth->fetchrow_array() || die "Could not prepare SQL statement:$sql";

这意味着即使查询正确执行但有 0 行,它也应该向您显示错误消息,这是不正确的。

因此,您需要做的就是修复该错误消息。如果查询执行失败,而不是当它正确执行但没有结果时,应该显示该骰子。

您可以像这样更正您的查询

$sql = "SELECT count(*) FROM member_temp WHERE member_Id = ?";
$xth = $dbh->prepare($sql);
$xth->execute($id) or die("Failed to execute query:". $xth->errstr);

你的行检查可以是

if ($xth->rows == 0) 
// No match found

【讨论】:

  • 我明白你的意思,但我仍然收到错误:DBD::mysql::st 执行失败:在 0 时使用 1 个绑定变量调用
  • 您可能没有根据此代码更新查询
  • 如果启用RaiseError,您就不必检查每个方法的成功。
猜你喜欢
  • 2016-02-16
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
相关资源
最近更新 更多