更新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>";
答案 0 :(得分:0)
从DBI documentation开始,似乎“do”方法对返回值有一些魔力:
DO
如果您正在执行UPDATE,INSERT或DELETE,则没有数据 从数据库回来,所以有一个捷径。你可以说
$ dbh-&gt; do('DELETE FROM WHERE年龄&gt; 65');例如,和DBI 将准备声明,执行它并完成它。返回一个 如果成功则返回true值,如果失败则返回false值。其实, 如果成功,则返回受影响的行数。在示例中 它会返回实际删除的行数。 (DBI 扮演一个神奇的技巧,即使它变成了它所转变的价值也是如此 这很奇怪,因为在Perl中0通常是假的。但它很方便,因为你可以将它用作数字或作为数字 真或假的成功代码,它可以双向运作。)
您确定更新无效吗?之后执行选择以仔细检查。可能只是你误解了返回代码。