MySQL语法错误";(空白)-UPDATE查询


MySQL syntax error on "" (blank) - UPDATE query

下面是我的PHP代码,但它没有更新数据,而是给了我以下错误:

您的SQL语法有错误;查看与MySQL服务器版本相对应的手册,了解在第2*行"附近使用的正确语法

我什么都试过了,但都没用。

<?php
    include 'includes/connection.php';
    if(!isset($_POST['submit'])) {
        mysql_query("UPDATE student SET `name`='$_POST[name]' , `email`='$_POST[email]' , `dob`='$_POST[dob]' , `phone`='$_POST[phone]' , `college`='$_POST[college]' , `address`='$_POST[address]' , `state`='$_POST[state]' , `country`='$_POST[country]' WHERE id = $_POST[id]") or die(mysql_error());
    }
?>      
        Student has been modified! <br/>
        <a href="index.php">Go to MAIN MENU</a>  

同一个查询在同一台服务器上使用不同的字段。但我不知道这是怎么回事。

您的查询是单行,但错误在第2行

您的代码是不安全的,您没有对值进行清理,错误来自于这个事实。mysql_*函数现在因此类错误而被弃用。

您的代码也有一个逻辑问题:如果用户向服务器提交了信息,您希望处理更改,但您的条件if (!isset($_POST['submit']))表示如果未设置,则会尝试在不应该更新信息的时候更新信息。

使用PDO(假设连接成功)

include 'includes/connection.php';
if (isset($_POST['submit'])) {
    $statement = $db->prepare("UPDATE student SET `name`=:name , `email`=:email , `dob`=:dob , `phone`=:phone , `college`=:college , `address`=:address , `state`=:state , `country`=:country WHERE id = :id");
    $statement->execute(array(
        ':name' => $_POST['name'],
        ':email' => $_POST['email'],
        ':dob' => $_POST['dob'],
        ':phone' => $_POST['phone'],
        ':college' => $_POST['college'],
        ':address' => $_POST['address'],
        ':state' => $_POST['state'],
        ':country' => $_POST['country'],
        ':id' => $_POST['id']
    ));
}

使用mysql_*函数

include 'includes/connection.php';
if (isset($_POST['submit'])) {
    $name = mysql_real_escape_string($_POST['name']);
    $email = mysql_real_escape_string($_POST['email']);
    $dob = mysql_real_escape_string($_POST['dob']);
    $phone = mysql_real_escape_string($_POST['phone']);
    $college = mysql_real_escape_string($_POST['college']);
    $address = mysql_real_escape_string($_POST['address']);
    $state = mysql_real_escape_string($_POST['state']);
    $country = mysql_real_escape_string($_POST['country']);
    $id = mysql_real_escape_string($_POST['id']);
    /**
     * For debugging purposes
     */
    $query = "UPDATE student SET `name`='$name' , `email`='$email' , `dob`='$dob' , `phone`='$phone' , `college`='$college' , `address`='$address' , `state`='$state' , `country`='$country' WHERE id = '$id'";
    mysql_query($query) or die(mysql_error());
    /**
     * For debugging purposes
     */
    echo "<pre>Last query: $query</pre>";
}

注意,$id应该:

  • 使用mysql_real_escape_string进行转义,并在查询中使用引号
  • 或者用intval转换成int(假设是数字索引)

哇,哇,哇!您没有验证任何数据并使用mysql_query()。通过SQL注入攻击服务器很容易!

尝试PDO:http://php.net/manual/en/book.pdo.php

返回主题:

请给我们看$_POST:的内容

print_r($_POST);

和完整的SQL字符串:

$sql = "UPDATE student SET `name`='$_POST[name]' , `email`='$_POST[email]' , `dob`='$_POST[dob]' , `phone`='$_POST[phone]' , `college`='$_POST[college]' , `address`='$_POST[address]' , `state`='$_POST[state]' , `country`='$_POST[country]' WHERE id = $_POST[id]";
echo $sql;

SQL看起来没那么好。实际上,您必须输出$_POST值,如下所示:

$_POST['name']

请帮自己一个忙并使用PDO!:-)

编辑1:逃离示例:

如果你不想使用PDO,至少可以这样尝试:

 $sql = "UPDATE student 
            SET `name`    = '". mysql_real_escape_string($_POST['name']) ."', 
                `email`   = '". mysql_real_escape_string($_POST['email']) ."', 
                `dob`     = '". mysql_real_escape_string($_POST['dob']) ."', 
                `phone`   = '". mysql_real_escape_string($_POST['phone']) ."',
                `college` = '". mysql_real_escape_string($_POST['college']) ."',
                `address` = '". mysql_real_escape_string($_POST['address']) ."',
                `state`   = '". mysql_real_escape_string($_POST['state']) ."',
                `country` = '". mysql_real_escape_string($_POST['country']) ."' 
          WHERE id = " . mysql_real_escape_string($_POST['id']);