Php 未捕获的mysqli\u sql\u异常:您的sql语法有错误

Php 未捕获的mysqli\u sql\u异常:您的sql语法有错误,php,mysql,sql,Php,Mysql,Sql,我不能让我的更新按钮工作,我的SQL语法没有正确地针对数据库,这是我使用的语法 $sql = ("UPDATE crud SET name='$name', last='$last', email='$email', birthday='$birthday' WHERE id=$id") or die($mysqli->error); 我尝试使用不同的语法,但它没有更新数据库 致命错误:未捕获mysqli\u sql\u异常:您的sql语法有错误;检查与MySQL服务器版本

我不能让我的更新按钮工作,我的SQL语法没有正确地针对数据库,这是我使用的语法

$sql = ("UPDATE crud SET name='$name', last='$last', email='$email', birthday='$birthday' WHERE id=$id") or
    die($mysqli->error);   
我尝试使用不同的语法,但它没有更新数据库

致命错误:未捕获mysqli\u sql\u异常:您的sql语法有错误;检查与MySQL服务器版本对应的手册


使用PHP和数据库
身体{
字体系列:Arial;
字体大小:14px;
}
.人{
宽度:45%;
浮动:左;
边框:1px实心暗光;
背景颜色:浅黄色;
填充:10px;
利润率:10px;
框大小:边框框;
}
.个人.照片{
浮动:左;
右边距:10px;
}

您需要转义post输入,因为某些输入可能包含导致MySQL错误的非法字符。这样做:
$id=mysqli\u real\u escape\u字符串($mysqli,$\u POST['id'])和错误将消失


但是,正如其他人所提到的,您不应该在未经验证和清理的情况下使用来自用户的输入来避免SQL注入攻击,或者只使用准备好的语句。

这只是一个使用SQL的示例。编写代码所需的时间并不比开始时多

<?php    
error_reporting(E_ALL);
ini_set('display_errors', true);

    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'admin';
    $pass = 'howtoforge';

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    try{
        $con = mysqli_connect($host, $user, $pass, $db);
    }catch (Exception $e){
        echo $e->getMessage();
        exit;
    }

    $name = 'NameF'; 
    $last = 'O\'Conner';
    $email = 'none@none.com';
    $birthday = '12/01/9999';
    $id = '1';

    try{
    $stmt = $con->prepare('
     UPDATE
        crud 
     SET
        name     = ?, 
        last     = ?, 
        email    = ?, 
        birthday = ?
     WHERE 
        id = ?;
    ');
    $stmt->bind_param('ssssi', $name, $last, $email, $birthday, $id);
    $stmt->execute();
    }catch (Exception $e){
        echo $e->getMessage();
        exit;
    }

您在那里输入了什么值?您的脚本存在风险。使用。您已经在使用支持带有界变量输入的预处理语句的API,您应该使用带有占位符(预处理语句)的参数化查询来保护您的数据库免受攻击!从和开始。如果你可以用正确的方法学习,那么没有理由要用错误的方法学习。为什么我们要用易受SQL注入攻击的模式编码?当有合适的模式可用时,行业专业人士为什么要花时间在错误模式中调试代码?作为一个借口,“这是为了学校作业”并没有减少它。推广邪恶编码模式的学校正在对学生造成伤害。(另外,字符串变量
$sql
赋值后的
或die
也没有意义。如果字符串赋值失败,mysqli->error将不会提供任何有用的信息。)即使字符串也不安全!我知道不是,其他人也向作者指出了这一点。我的答案是解决当前的问题,我补充了一些注意事项。我知道你想回答这些问题,但我们什么时候才能停止支持懒惰呢。海报不关心或不知道准备好的陈述,因为老师不关心或不知道。那么现在我们有多少程序员进入了工作队伍。他们不知道自己会造成怎样的问题。我认为,在回答别人的问题的同时,向他们展示更好的方式是正确的。任何看到答案的人都会看到这样一部分,即不应直接使用输入,以及更好的方法。请不要仅仅为了重复它而捕获异常。
<?php    
error_reporting(E_ALL);
ini_set('display_errors', true);

    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'admin';
    $pass = 'howtoforge';

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    try{
        $con = mysqli_connect($host, $user, $pass, $db);
    }catch (Exception $e){
        echo $e->getMessage();
        exit;
    }

    $name = 'NameF'; 
    $last = 'O\'Conner';
    $email = 'none@none.com';
    $birthday = '12/01/9999';
    $id = '1';

    try{
    $stmt = $con->prepare('
     UPDATE
        crud 
     SET
        name     = ?, 
        last     = ?, 
        email    = ?, 
        birthday = ?
     WHERE 
        id = ?;
    ');
    $stmt->bind_param('ssssi', $name, $last, $email, $birthday, $id);
    $stmt->execute();
    }catch (Exception $e){
        echo $e->getMessage();
        exit;
    }