Perl,SQL,DBI:为什么我的UPDATE函数不起作用?代码和我在里面尝试过的东西

时间:2013-11-22 02:38:11

标签: mysql sql perl dbi

更新2:我从未找到解决方案。由于教师的代码随时可供我们使用并与我们自己一起破解,并且我已经浪费了几周试图调试,我只是创建了一个新表并从他的代码开始,在我去的时候进行了更改和测试,直到我最终得到了我想要的功能。如果每个人都遇到奇怪行为的原因,我真诚地感谢知道造成这种情况的原因。

几乎所有提出任何建议的人都提出了我已经尝试过的想法,并在我原来的帖子中列出了已经尝试过的想法。感谢大家提供他们的见解,但请在提出建议之前完整阅读帖子。

更新:更清楚地提出我的主要问题。原始帖子低于所有代码,以及我尝试过的内容。

我设计了updateData()函数来更新记录。相反,它会返回错误代码。

sub updateData {
    # and this returns "Update Failed!" for me. I can't figure out why.

    $sql = "UPDATE friendface SET first_name = '$first_name',
        last_name = '$last_name',
        email_address = '$email_address',
        password = '$password'
        WHERE user_id = $user_id;";

    $rc = $dbh->do($sql);
    if ($rc != 1) {
        print "Update Failed!";
    }
}

Ninja编辑,因为我重读了这个烂摊子3:

底部的代码。对不起,如果格式很糟糕或我的描述性不够。我真的试过了。问我是否可以提供其他有用的东西。

大家好,

此处的学校作业,打印一个包含您可以编辑和删除的记录的表格。

我有一个HTML页面,其中包含用于插入数据的表单,然后是一个perl脚本,用于显示包含要更新和删除按钮的表格。删除工作正常。整个脚本工作正常(除了你直接访问.pl时得到的文本块的链接,但我现在不关心)没有我的UPDATE函数的内容。 UPDATE函数的代码在MySQL中逐行工作。但我无法使用UPDATE查询获取updateData函数以在我的.pl文件中工作。

我们可以完全访问教师的示例代码。我可以从他的页面开始,然后将其修改为我自己的页面。我宁愿能够在不依赖拐杖的情况下编写自己的页面。但是,我将我的代码与他的代码进行比较,我不知道我哪里出错了。语法看起来很好,据我所知/可以找到文档。

  • 我为了以防万一而使用不同的语法。在我的WHERE子句之前的最后一条记录之后放一个逗号,因为它看起来没错,但显然没有办法。我读到的所有内容都说当前的语法是正确的。

  • 我想也许是在尝试编辑一个不存在的user_id,但是打印user_id表明它使用的是正确的。{/ p>

  • 我认为我的DBI->connect正在运行,因为它不会返回连接失败。

  • 正在运行正确的函数updateData(),因为最终输出是Update Failed返回代码,对该函数是唯一的。

  • 我可以通过编辑按钮跟踪代码>编辑表格>确认编辑功能> updateData function> $ dbh成功验证do($sql),这是我的UPDATE查询,看起来语法正确。但出于某种原因,$dbh->do($sql);并不是真的。

  • updateData函数中,我认为我确定问题不在于我只更新了6个字段中的4个。好吧,5,因为密钥永远不会被更新。无论如何,我认为可能会以某种方式绊倒它,但添加一行来更新用户名并没有帮助,所以我再次把它拿出来。

我一直在试图自己解决这个问题,而且我正在把头发拉出来。这总是一些愚蠢的小事。是间距吗?它通常没关系,但我知道ENDFORM必须是第一个也是唯一一个为我工作的东西。但我不知道这个特定代码的任何间距规则。请。指出我正确的方向。

为了明确,printEditButton()printDeleteButton()是编辑和删除按钮的代码......

DESC表,html页面的代码和pl脚本如下:

*********************
*********************
***DESC friendface***
*********************
*********************

Field   Type    Null    Key Default Extra
user_id int(11) NO  PRI NULL    auto_increment
username    char(50)    YES     NULL    
first_name  char(20)    YES     NULL    
last_name   char(20)    YES     NULL    
email_address   char(50)    YES     NULL    
password    char(50)    YES     NULL    




*********************
*********************
*friendFaceForm.html*
*********************
*********************

<table bgcolor='antiquewhite' align=center cellpadding=2>
<form action='friendFaceForm.pl' method=GET>

<tr>
    <td align=right>Username</td>
    <td><input type=text name=username></td>
</tr>

    <tr>
        <td align=right>First Name</td>
        <td><input type=text name=first_name></td>
    </tr>

    <tr>
        <td align=right>Last Name</td>
        <td><input type=text name=last_name></td>
    </tr>


    <tr>
        <td align=right>Email Address</td>
        <td><input type=text name=email_address></td>
    </tr>

    <tr>
        <td align=right>Password</td>
        <td><input type=text name=password></td>
    </tr>

    <tr>
        <td align=center colspan=2> <input type=submit name=action value='Insert Data'></td>
    </tr>


</form>
</table>


*********************
*********************
**friendFaceForm.pl**
*********************
*********************

#!/usr/bin/perl

use CGI qw(:standard);
use DBI;
use warnings;

print "Content-type: text/html\n\n";

$dbh = DBI->connect("DBI:mysql:jwiard1:localhost", "jwiard1", "jwiard1")
    or endProgram("Connection Failed!");

$action = param('action');
$user_id = param('user_id');
$username = param('username');
$first_name = param('first_name');
$last_name = param('last_name');
$email_address = param('email_address');
$password = param('password');

if ($action eq 'Insert Data') {
#$action holds this value coming from the html page
#this happens first

    insertData();
    printTable();

}
elsif ($action eq 'Edit') {
#prints the edit form

    printEditForm();

}
elsif ($action eq 'Confirm Edit') {
#then updateData() runs

    updateData();
    printTable();

}
elsif ($action eq 'Delete') {

    deleteData();
    printTable();

}
elsif ($action eq 'Print Table') {

    printTable();

}
else {

    print "Either you are accessing this file directly or \$action has an unaccounted         for value.<br><br>

    If it's the former, get out of here!<br><br>

    If it's the latter... you're getting sleepy. You're getting verrrry sleepy. When     you reach the end of this sentence, you'll wake up with no memory of this page and a strong     feeling that Joe Wiard's code is perfect.<br><br>

    ...or did you just want to see the table?";

    print "<input type=submit name=action value='Print Table'>";

}







####
#Functions! Yay!
####

sub endProgram {
    my ($msg) = @_;
    print $msg;
    die();
}

sub insertData {
#after inserting data, the user is left to click Edit or Delete
#making $action hold the value of 'Edit' or 'Delete' Go to elsif($action eq 'Edit'

    print "Your data has been saved.";

    $sql = "INSERT INTO friendface SET user_id='$user_id',
        username='$username',
        first_name='$first_name',
        last_name='$last_name',
        email_address='$email_address',
        password='$password'  ;";

        $rc = $dbh->do($sql);
        if ($rc != 1) {
            print "Insert failed!";
        }
}

sub printEditButton {

print "<form>";
print "<input type=hidden name=user_id value='$href->{user_id}'>";
print "<input type=submit name=action value='Edit'>";
print "</form>";

}

sub printDeleteButton {

print "<form>";
print "<input type=hidden name=user_id value='$href->{user_id}'>";
print "<input type=submit name=action value='Delete'>";
print "</form>";

}

sub confirmEdit {



}

sub lookUpRow {

    $sql = "SELECT * FROM friendface WHERE user_id=$user_id;";

    $sth = $dbh->prepare($sql);

    $rc = $sth->execute();

    $href = $sth->fetchrow_hashref();

}

sub printEditForm {
#prints fields for 4 of the values in a record. I don't want the user to be able to
#change their username. They can only edit first and last names, email and password.
#after this, $action either holds 'Confirm Edit' or 'Cancel'. Go to elsif
#($action'Confirm Edit')

    lookUpRow();

    print <<ENDOFFORM;
    <form>
    First Name: <input type=text name=first_name value='$href->{first_name}'> <br>
    Last Name:  <input type=text name=last_name value='$href->{last_name}'> <br>
    Email Address:  <input type=text name=email_address value='$href->{email_address}'>         <br>
    Password:  <input type=text name=password value='$href->{password}'> <br>
    <input type=hidden name=user_id value=$href->{user_id}'> <br>
    <input type=submit value="Confirm Edit" name=action>
    <input type=submit value="Cancel" name=action>
    </form>
ENDOFFORM
#It seems that ENDOFFORM *MUST* be at the beginning of the line. No TABS or SPACES
#preceeding, and NOTHING after. Half an hour of debugging lead me to discovery this
#tidbit that I should have just remembered from class. Or Googled. :P
}

sub updateData {
#and this returns "Update Failed!" for me. I can't figure out why.


    $sql = "UPDATE friendface SET first_name = '$first_name',
        last_name = '$last_name',
        email_address = '$email_address',
        password = '$password'
        WHERE user_id = $user_id   ;";

    $rc = $dbh->do($sql);
    if ($rc != 1) {
        print "Update Failed!";
    }

}

sub deleteData {

    $sql = "DELETE FROM friendface WHERE user_id = $user_id;";

    $rc = $dbh->do($sql);

}

sub printTable {

    $sql = "SELECT * FROM friendface;";
    $sth = $dbh->prepare($sql);
    $rc = $sth->execute();

    $count = 0;

    print "<table>";

    #print header

    while ($href = $sth->fetchrow_hashref() ) {

        $count ++;
        if ($count % 2 == 0) {
            print "<tr bgcolor=lightblue>";
        }
        else {
            print "<tr bgcolor=lightgray>";
        }

        print "<td>";
        print $href->{'user_id'};
        print "</td>";
        print "<td>";
        print $href->{'username'};
        print "</td>";
        print "<td>";
        print $href->{'first_name'};
        print "</td>";
        print "<td>";
        print $href->{'last_name'};
        print "</td>";
        print "<td>";
        print $href->{'email_address'};
        print "</td>";
        print "<td>";
        print $href->{'password'};
        print "</td>";
        print "<td>";
        printEditButton();
        print "</td>";
        print "<td>";
        printDeleteButton();
        print "</td>";

        print "</tr>";
    }

    print "</table>";

1 个答案:

答案 0 :(得分:0)

DBI documentation开始,似乎“do”方法对返回值有一些魔力:

  

DO

     

如果您正在执行UPDATE,INSERT或DELETE,则没有数据   从数据库回来,所以有一个捷径。你可以说

     

$ dbh-&gt; do('DELETE FROM WHERE年龄&gt; 65');例如,和DBI   将准备声明,执行它并完成它。返回一个   如果成功则返回true值,如果失败则返回false值。其实,   如果成功,则返回受影响的行数。在示例中   它会返回实际删除的行数。 (DBI   扮演一个神奇的技巧,即使它变成了它所转变的价值也是如此   这很奇怪,因为在Perl中0通常是假的。但它很方便,因为你可以将它用作数字或作为数字   真或假的成功代码,它可以双向运作。)

您确定更新无效吗?之后执行选择以仔细检查。可能只是你误解了返回代码。