Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/SQL解析错误_Php_Mysql - Fatal编程技术网

PHP/SQL解析错误

PHP/SQL解析错误,php,mysql,Php,Mysql,不知道我的问题是什么。在第四行,我不断收到一个错误 分析错误:语法错误,意外的T_封装_和_空白, 应为T_字符串、T_变量或T_NUM_字符串 我想它不是4号线,但可能是。我是错过了什么,还是我只是在胡闹 $id = $_GET['id']; $query = "UPDATE todo_item2 SET todo = $_POST['i'], percent = $_POST['p']

不知道我的问题是什么。在第四行,我不断收到一个错误

分析错误:语法错误,意外的T_封装_和_空白, 应为T_字符串、T_变量或T_NUM_字符串

我想它不是4号线,但可能是。我是错过了什么,还是我只是在胡闹

    $id = $_GET['id'];

        $query = "UPDATE todo_item2
                  SET todo = $_POST['i'], 
                      percent = $_POST['p'], 
                      due_date = $date
                  WHERE todo_id = :id";

        $query2 = "UPDATE todo_category2
                  SET category = $_POST['c']
                  WHERE todo_id = :id";

    $id = $_GET['id'];

    $statement1 = $db->prepare($query);
    $statement1 -> execute(array(
        'id' =>$id,
    ));

    $statement2 = $db->prepare($query2);
    $statement2 -> execute(array(
        'id' =>$id,
    ));

带引号键的数组元素需要使用卷曲语法才能正确解析:

以下代码应该可以工作:

    $query = "UPDATE todo_item2
              SET todo = {$_POST['i']}, 
                  percent = {$_POST['p']}, 
                  due_date = $date
              WHERE todo_id = :id";

    $query2 = "UPDATE todo_category2
              SET category = {$_POST['c']}
              WHERE todo_id = :id";

无论如何,考虑到安全性,在SQL查询中直接使用
$\u POST
数组元素是一个糟糕的主意

用括号封装阵列访问:

因此,将
$\u POST['i']
更改为
{$\u POST['i']}

$id = $_GET['id'];

$query = "UPDATE todo_item2
              SET todo = {$_POST['i']}, 
                  percent = {$_POST['p']}, 
                  due_date = $date
              WHERE todo_id = :id";

$query2 = "UPDATE todo_category2
              SET category = {$_POST['c']}
              WHERE todo_id = :id";

$id = $_GET['id'];

$statement1 = $db->prepare($query);
$statement1 -> execute(array(
    'id' =>$id,
));

$statement2 = $db->prepare($query2);
$statement2 -> execute(array(
    'id' =>$id,
));

鉴于您已经在使用准备好的语句,您也应该将更新的值移动到绑定参数-

   $query = "UPDATE todo_item2
              SET todo = :todo, 
                  percent = :percent, 
                  due_date = :date
              WHERE todo_id = :id";

    $query2 = "UPDATE todo_category2
              SET category = :category
              WHERE todo_id = :id";

$id = $_GET['id'];

$statement1 = $db->prepare($query);
$statement1 -> execute(array(
    'todo' => $_POST['i']
    'id' =>$id,
    'percent' => $_POST['p'],
    'date' => $date
));

$statement2 = $db->prepare($query2);
$statement2 -> execute(array(
    'id' =>$id,
    'category' => $_POST['c']
));

为什么要正确地准备id而不是其他字段?不要直接在sql字符串中使用传入的用户数据。请制作一个测试用例。问题隔离是调试的基础,您在求助于此处之前似乎没有做过任何操作。将来自$\u POST的数据直接放入SQL查询中,而不应用“转义”,它将尝试执行$\u POST数据中的任何SQL语法,这会导致像你刚刚发现的那样的错误,但更重要的是,这是一个巨大的安全漏洞,通常允许黑客接管你的网站。你真的需要花一点时间来研究这个问题,以确保你做得完全正确。好吧,我没有意识到这是必要的。非常感谢。我的数据在这一点之前被检查,如果它无效,它不会到达这一点,但我会将其更改为更安全的方法。谢谢你的建议!