1

下面是我的 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>  

相同的查询在同一台服务器上处理不同的字段。但我不知道这有什么问题。

4

2 回答 2

2

您的查询是单行,但错误在第 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在查询中使用引号进行转义
  • 或转换为 int intval(假设是数字索引)
于 2013-06-25T16:57:06.137 回答
0

哇哇哇!您没有验证任何数据并使用 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']);
于 2013-06-25T15:58:48.713 回答