【问题标题】:PHP/mySQL: How do a concatenate a variable in a mysql query? [duplicate]PHP/mySQL:如何在 mysql 查询中连接变量? [复制]
【发布时间】:2012-01-04 04:32:10
【问题描述】:

在 mysql_query 中连接文本和 PHP 变量的正确方法是什么?这是我的尝试:

page.'$pageID'

我希望它输出page3

这里是所有代码(简化为专注于 mysql_query):

if ($_POST['pageProgress']) {
        $pageProgress = $_POST['pageProgress'];
        $pageID = 3;
        $userID = 1;
        $updateUserProgress = mysql_query("UPDATE test SET page.'$pageID'='$pageProgress' WHERE userID='$userID'") or die(mysql_error());
    }

如果我简单地将page.'$pageID' 替换为page3,所有代码都可以完美运行。

【问题讨论】:

  • 请阅读 PHP 中的 SQL 注入和预处理语句。您即将在代码中添加一个巨大的安全漏洞。

标签: php mysql variables concatenation


【解决方案1】:

您不需要.。 PHP 解析双引号 (") 字符串并将变量替换为它们的值。因此:

$pageID = 3;
echo "UPDATE test SET page$pageID = '$pageProgress' WHERE userID = '$userID'";

http://codepad.viper-7.com/uIdqqH

【讨论】:

  • 虽然page" . $pageID . " 确实有效,但我更喜欢你的方法。我认为它更清洁并且有效!
  • 我还发现它比点运算符的混乱要干净得多。请记住,它只适用于像"this" 这样的双引号字符串,而不是像'that' 这样的单引号字符串。
【解决方案2】:

问题是您的 .'$pageID' 在双引号字符串中;你不要在 MySQL 端连接它;它早在 MySQL 看到它之前就被解析了。

可能是您试图转义 Mysql 的字段名称,在这种情况下,您使用反引号。

试试:

'UPDATE test SET `page'.$pageID.'`=\''.$pageProgress.'\' WHERE...'

或者,眼睛更容易:

"UPDATE test SET `page{$pageID}`='{$pageProgress}' WHERE..."

【讨论】:

  • 我还没有尝试过这个解决方案。我选择了 Xeon06 的解决方案:page$pageID。我认为它更干净一些。不过还是谢谢你的回答!
  • 如果它有用,即使你接受至强的回答,你也可以给它+1,这也很好。您应该养成在 MySQL 中使用反引号转义字段名称的习惯,并且还需要认真考虑@Phillippe_Gerber 关于转义变量的说明(查看mysql_real_escape_string()
  • 感谢您的补充意见。我理解使用mysql_real_escape_string(),但是转义字段名称的目的是什么?
  • 当您开始使用变量代替硬编码文本时,转义总是一个好主意。您可以稍后将其扩展为处理多个表,从 SQL Server 或 Oracle 设置中导入表,或者毫不客气地添加保留字作为字段名称(如 casecurrent_usergroup)。如果您的字段名称是硬编码的,这些很容易找到,因为您将在第一次运行该函数时知道。但是,对于可变字段名称,您可能在名称失败时直到生产时才发现这一点(除非它被转义)。
  • 我在支持多个数据库的产品中经常遇到这个问题(很难找到与至少一个不冲突的字段名称)。
【解决方案3】:

"UPDATE test SET page".$pageID."='".$pageProgress."' WHERE userID='".$userID."';"

点在 PHP 的字符串函数中是错误的。

【讨论】:

    【解决方案4】:

    类似的东西。

    mysql_query("UPDATE test SET page" . $pageID . " = '" . $pageProgress . "' WHERE userID = " . $userID)
    

    【讨论】:

    • 这确实有效,但我更喜欢 Xeon06 的解决方案:page$pageID。感谢您的解决方案!
    【解决方案5】:

    试试

    mysql_query('UPDATE test SET page'.$pageID.'='.$pageProgress.' WHERE userID='.$userID)
    

    【讨论】:

    • 我尝试使用带单引号的方法,但它对我不起作用。它确实可以使用双引号。我使用 Xeon06 的解决方案:page$pageID。不过谢谢你的回答。
    【解决方案6】:
    $updateUserProgress = mysql_query("UPDATE test SET page".$pageID." = '".$pageProgress."' WHERE userID='".$userID."'") or die(mysql_error());
    

    @Marc B ;这不是问题..

    【讨论】:

    • 正确!我喜欢你的想法。
    • 这确实有效,但我更喜欢 Xeon06 的解决方案:page$pageID。感谢您的解决方案!
    【解决方案7】:

    你不需要连接任何东西。不过,您确实需要从帖子中清理您的变量。

       if ($_POST['pageProgress']) {
        $pageProgress = mysql_real_escape_string($_POST['pageProgress']);
        $pageID = 3;
        $userID = 1;
        $updateUserProgress = mysql_query("UPDATE test SET page$pageID='$pageProgress' WHERE   userID='$userID'") or die(mysql_error());
        }
    

    【讨论】:

    • 感谢您的回答!它将被消毒!
    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多