我已经阅读了很多关于这个主题的帖子,我的脑袋已经准备好爆炸了。
我正在尝试创建一个小表单来更新客户端的潜在客户数据库,并列出数据库中的所有条目。我不是我向客户反复提到的后端开发人员,但我的客户似乎并不关心...所以我正在努力解决这个问题。
我在“前景”表中创建了以下所有列:“id”,“fname”,“lname”,“tickler”和“info”。所以我知道他们在那里。此外,他们对更新表单下方的潜在客户列表工作得很好(工作得很好)。
但是当我尝试更新数据库时,我收到“无法更新数据:'where子句'中的未知列'$ id'”错误。如果我删除WHERE子句,它会切换到“无法在'字段列表'中更新数据:未知列'$ fname'”。目前我只是尝试使用ID#作为条件来使用First Name。最终它也能够更新其他领域。
我不知道是否有人可以看到该页面(我认为我的客户端密码保护了该页面并且我仍然登录),但您可以尝试在http://www.vlist.info查看它。
以下是代码:
<body>
<h2>Update Prospect</h2>
<?php
if(isset($_POST['update']))
{
$dbhost = 'host';
$dbuser = 'dbo558532591';
$dbpass = 'pass';
$dbname = 'db558532591';
$tablename = 'prospects';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$id = $_POST['id'];
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$tickler = $_POST['tickler'];
$info = $_POST['info'];
mysql_select_db( $dbname ) or die('Could not find table:' . mysql_error());
$sql = 'UPDATE prospects SET fname = $fname WHERE id = $id';
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
mysql_close($conn);
}
else
{
?>
<form method="post" action="<?php $_PHP_SELF ?>">
<table>
<tr>
<th>ID:</th>
<th>First Name:</th>
<th>Last Name:</th>
<th>Tickler:</th>
<th>Info:</th>
<th></th>
</tr>
<tr>
<td><input type="text" name="id" /></td>
<td><input type="text" name="fname" /></td>
<td><input type="text" name="lname" /></td>
<td><input type="text" name="tickler" /></td>
<td><input type="text" name="info" /></td>
<td><input type="submit" value="Update" name="update" /></td>
</tr>
</table>
</form>
<?php
}
?>
<h2>Prospects</h2>
<?php $localhost="host";$username="dbo558532591";$password="pass";$database="db558532591";
mysql_connect($localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database.");
$query="SELECT * FROM prospects";$result=mysql_query($query);
$num=mysql_numrows($result);mysql_close();?>
<table>
<tr>
<th>ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Tickler</th>
<th>Info</th>
</tr>
<?php $i=0;while ($i < $num) {
$id=mysql_result($result,$i,"id");
$fname=mysql_result($result,$i,"fname");
$lname=mysql_result($result,$i,"lname");
$tickler=mysql_result($result,$i,"tickler");
$info=mysql_result($result,$i,"info");
?>
<tr>
<td><?php echo $id; ?></td>
<td><?php echo $fname; ?></td>
<td><?php echo $lname; ?></td>
<td><?php echo $tickler; ?></td>
<td><?php echo $info; ?></td>
</tr>
</table>
<?php $i++;}?>
答案 0 :(得分:0)
试试这个:
$sql = 'UPDATE prospects SET fname = "'.$fname.'" WHERE id = '.$id;
答案 1 :(得分:0)
问题在于您构建查询的方式
$sql = 'UPDATE prospects SET fname = $fname WHERE id = $id';
echo $sql;
输出
UPDATE prospects SET fname = $fname WHERE id = $id // Your variables are not recognized and not read
解决方案:
将您的查询更改为
$sql = "UPDATE prospects SET `fname` = '$fname' WHERE `id` = '$id'";
始终将查询放在双引号内。使用反引号和带有单引号的变量封装列名称
有关单引号和双引号用法的更多信息
单引号不会在双引号
时查找变量案例1:
$value = 10;
$sql = 'SELECT * FROM `table_name` WHERE `column_name` = $value';
echo $sql;
输出
SELECT * FROM `table_name` WHERE `column_name` = $value
这里,如果您看到单引号不在其中查找变量。无论单引号内是什么,它都被视为一个字符串并返回原样。
案例2:
$value = 10;
$sql = "SELECT * FROM `table_name` WHERE `column_name` = $value";
echo $sql;
输出
SELECT * FROM `table_name` WHERE `column_name` = 10
此处由于查询在双引号内,因此读取该变量。但被认为是int。
案例3:
$value = 10;
$sql = "SELECT * FROM `table_name` WHERE `column_name` = '$value'";
echo $sql;
输出
SELECT * FROM `table_name` WHERE `column_name` = '10'
此处由于查询在双引号内,因此读取该变量。但被认为是字符串,因为它用单引号封装。
答案 2 :(得分:0)
在$ sql字符串中传递文字&#34; $ fname&#34;和&#34; $ id&#34;进入查询,而不是获取变量的值。
除了Corentin的解决方案,你也可以试试这个:
$sql = sprintf('UPDATE prospects SET fname = "%s" WHERE id = %d', $fname, $id);
答案 3 :(得分:0)
需要修复您的代码以删除SQL注入漏洞。你可以这样做:
$id = mysql_real_escape_string($_POST['id']);
对$_GET
,$_REQUEST
和$_POST
的所有阅读案例执行此操作。
请记住,您使用的库已被弃用,您应该切换到mysqli或PDO / mysql。两者都提供参数化,这是将用户输入安全地注入查询的首选方式。
答案 4 :(得分:0)
好吧,要添加@IndraKumarS的答案,你应该始终使用mysqli_*
或PDO语句。
$sql = "UPDATE `prospects` SET `fname` = '$fname' WHERE `id` = '$id'";
mysqli_query($connection, $sql);
mysqli_ *功能更安全
<强>反引号强>
您应该对表名和列名使用反引号。它更安全,如果你有一个恰好是mysql运算符的表名,它将阻止查询工作。
双引号
对于查询字符串,双引号将允许$变量作为其值进行扩展。查看http://php.net/manual/en/language.types.string.php
作为旁注,您应该始终在单引号中附上$变量&#39;确保您的查询字符串正常工作。