MySQL和PHP:WHERE子句中的未知列,但确实存在列

时间:2015-01-02 20:24:52

标签: php mysql

我已经阅读了很多关于这个主题的帖子,我的脑袋已经准备好爆炸了。

我正在尝试创建一个小表单来更新客户端的潜在客户数据库,并列出数据库中的所有条目。我不是我向客户反复提到的后端开发人员,但我的客户似乎并不关心...所以我正在努力解决这个问题。

我在“前景”表中创建了以下所有列:“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++;}?>

  

5 个答案:

答案 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;确保您的查询字符串正常工作。