“@dfaf.fa”附近的MySql和PHP语法错误

“@dfaf.fa”附近的MySql和PHP语法错误,php,mysql,Php,Mysql,当我写电子邮件时,我为findID创建了一个简单的站点 HTML代码 PHP代码 我尝试查找电子邮件的ID:dfaf@dfaf.fa它在我的ID为13的数据库中,我发现这个错误,您的SQL语法中有一个错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行“@dfaf.fa”附近使用的正确语法。这是关于将电子邮件作为整数传递,将其作为字符串传递 mysqli_query($connessione,"SELECT user_id FROM user_tmplt WHERE user_ma

当我写电子邮件时,我为findID创建了一个简单的站点

HTML代码

PHP代码


我尝试查找电子邮件的ID:dfaf@dfaf.fa它在我的ID为13的数据库中,我发现这个错误,您的SQL语法中有一个错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行“@dfaf.fa”附近使用的正确语法。这是关于将电子邮件作为整数传递,将其作为字符串传递

  mysqli_query($connessione,"SELECT user_id FROM user_tmplt WHERE user_mail = $emailUser");    

 to

 mysqli_query($connessione,"SELECT user_id FROM user_tmplt WHERE user_mail = '".$emailUser."' ");

这会起作用,但直接在查询中传递参数是不安全的,请首先确保sql注入安全…

这是关于将电子邮件作为整数传递,将其作为字符串传递

  mysqli_query($connessione,"SELECT user_id FROM user_tmplt WHERE user_mail = $emailUser");    

 to

 mysqli_query($connessione,"SELECT user_id FROM user_tmplt WHERE user_mail = '".$emailUser."' ");

这会起作用,但直接在查询中传递参数是不安全的,请首先确保sql注入安全…

此查询将暴露于sql注入。在where子句中使用之前,请始终清理或转义字符串中的特殊字符。在本例中,使用引号包装$email

换衣服

$email to '".$emailUser."'

在where子句中。

此查询将暴露于sql注入。在where子句中使用之前,请始终清理或转义字符串中的特殊字符。在本例中,使用引号包装$email

换衣服

$email to '".$emailUser."'

在where子句中。

您应该使用准备好的语句来避免此类错误,并避免:


您应该使用准备好的语句来避免此类错误,并避免:


您当前的问题(如已回答的)是,您没有在SQL查询中将电子邮件地址中的字符串参数标记为字符串文字。因此,MySQL服务器将其解释为与数据库/表/字段名类似的标识符。由于@是标识符中的无效字符,服务器报告了您发布的错误,请参阅

要在查询中标记字符串文字,默认情况下将其放在单引号中:

 SELECT x FROM table WHERE y=z // compares the value of the field y with the value of the field z in each record
 SELECT x FROM table WHERE y='z' // compares the value of the field y with the string literal 'z' <- that's what you want

您当前的问题(如已回答的)是,您没有在SQL查询中将电子邮件地址中的字符串参数标记为字符串文字。因此,MySQL服务器将其解释为与数据库/表/字段名类似的标识符。由于@是标识符中的无效字符,服务器报告了您发布的错误,请参阅

要在查询中标记字符串文字,默认情况下将其放在单引号中:

 SELECT x FROM table WHERE y=z // compares the value of the field y with the value of the field z in each record
 SELECT x FROM table WHERE y='z' // compares the value of the field y with the string literal 'z' <- that's what you want


:请参阅或至少从user_tmplt中选择user_id,其中user_mail='$emailUser';添加单引号:请参阅或至少从user_tmplt中选择user_id,其中user_mail='$emailUser';添加单引号。他的问题是为什么它不起作用,我也会提到sql注入..等等谢谢,现在我在“where子句”中有一个未知列“user\u mail”:你的列必须是user\u email:…检查数据库表@Danyal:绝对;如果它没有回答最初的问题,我可能会否决你的答案;-这只是一个常见的比喻,所以为了sql注入安全解决方案而唠叨,唠叨,唠叨,唠叨……因为这太烦人了。sql注入在OWASP最易受攻击的列表中已经…年了,但是你回头发现下一个入门级程序员也在学习同样的愚蠢错误。我希望这是最后一个问题:P,我能像字符串或整数一样获得ID吗?他的问题是为什么它不工作,我也会提到sql注入..等等,谢谢,现在我在“where子句”中发现了未知列“user\u mail”的错误:您的列必须是user\u email:…检查数据库表@Danyal:absolute;如果它没有回答最初的问题,我可能会否决你的答案;-这只是一个常见的比喻,所以为了sql注入安全解决方案而唠叨,唠叨,唠叨,唠叨……因为这太烦人了。sql注入被列为最易受攻击的OWASP列表已有…年了,但你回头发现下一个入门级程序员也在学习同样的愚蠢错误。我希望这是最后一个问题:P,我能像字符串或整数一样获得ID吗?关于“未知列”错误,检查表架构,看看是否有一个名为“user\u mail”的列。关于“unknown column”错误,请检查表架构,看看是否有一个名为“user\u mail”的列。如果默认情况下这样做,不用考虑每个数据库查询,同样可以避免一些最烦人的数据库安全问题。不是所有的;从来没有一颗银弹;但这是一个良好的开端。看到我的代码了吗?我没有发布代码。我只是编辑了这个答案来更正一些东西。我尝试了你的正确代码,但我有一些错误。不要担心:是的,使用此代码可以避免Sql inyAction,例如,如果有人修改了$\u POST['user\u id\u test']=1或1=1。使用您的代码,查询将执行SELECT user_id FROM user_tmplt,其中user_mail=1或1=1是正确的,如果您使用准备好的语句,您将避免这种行为感谢@VolkerK,您是对的,应该添加一些错误处理,这是这一行
默认情况下,您可以这样做,而不用考虑每个数据库查询,就像您可以避免一些最烦人的数据库安全问题一样。不是所有的;从来没有一颗银弹;但这是一个良好的开端。看到我的代码了吗?我没有发布代码。我只是编辑了这个答案来更正一些东西。我尝试了你的正确代码,但我有一些错误。不要担心:是的,使用此代码可以避免Sql inyAction,例如,如果有人修改了$\u POST['user\u id\u test']=1或1=1。使用您的代码,查询将执行SELECT user_id FROM user_tmplt,其中user_mail=1或1=1是正确的,如果您使用准备好的语句,您将避免这种行为。谢谢@VolkerK,您是对的,应该添加一些错误处理,这是这一行。
<?php
define('POST_FIELD_MAIL', 'user_id_test');

if ( !isset($_POST[POST_FIELD_MAIL]) ) { // maybe the resource (...script) has been requested without that parameter?
    trigger_error('missing parameter '.POST_FIELD_MAIL, E_USER_ERROR);
}
else {
    /** that's you part you probably want in inc/db.php */
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');  
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // that's why there's not error handling code after each and every call to a pdo function/method
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    /* ***** */

    try {
        $stmt = $pdo->prepare('SELECT user_id FROM user_tmplt WHERE user_mail=?'); // avoiding sql injections
        $stmt->execute( array($_POST[POST_FIELD_MAIL]) );

        $row = $stmt->fetch();
        if (!$row) {
            echo '<div>no such record</div>';
        }
        else {
            echo '<div>user_id=', htmlspecialchars($row['user_id']), '</div>';
        }
    }
    catch(PDOException $pex) {
        yourErrorHandler();
    }
}