【问题标题】:How to Insert a Value That Might Contain an Apostrophe如何插入可能包含撇号的值
【发布时间】:2013-09-26 08:20:06
【问题描述】:

我将如何编写一个 SQL 语句来插入可能包含撇号的值(例如,一个人的姓是 Conner,另一个人的姓是 O'Conner)?经过一番搜索,我找到了使用双撇号 (O''Conner example) 的示例,但每个示例都在INSERT 中硬编码了字符串。我没有遇到任何值可能包含或不包含撇号的示例。

我的简单语句在不使用撇号时没有任何问题,但如果使用撇号则失败。我知道我可以使用str_replace 替换撇号,但显然,这会导致 O'Conner 示例显示为 OConner。

这是一个简写版本,仅作为示例:

page1.php

// PHP
include_once('phpdata.php');
if (isset($_POST['firstname']) && isset($_POST['lastname'])) {
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];

    // SQL connection
    $insert = doInsert($firstname, $lastname);
    // Execute statement using odbc_exec, etc.
}

// HTML
<input type="text" class="required" name="firstname" id="firstname" />
<input type="text" class="required" name="lastname" id="lastname" />

phpdata.php

function doInsert($firstname, $lastname) {
    $insert = "INSERT INTO mytable (firstname, lastname)
                VALUES ('$firstname', '$lastname')";
    return $insert;
}

【问题讨论】:

标签: php sql


【解决方案1】:

将 PDO 与准备好的语句一起使用将负责转义您的输入:

$dsn  = "mysql:host=localhost;dbname=your_db_name";
try {
    $db = new PDO($dsn, 'your_username', 'your_pass');
 } catch (PDOException $e) {
    die( "Erreur ! : " . $e->getMessage() );
 }

 $query  = "INSERT INTO mytable (firstname, lastname)
            VALUES (:firstname', :lastname)";
 $stmt   = $db->prepare($query);                          
 $stmt->bindParam(':firstname', $firstname);
 $stmt->bindParam(':lastname', $lastname);
 $stmt->execute();

文档:PHP Data Objects

【讨论】:

  • 现在使用 ODBC... :-)(参见 OP)
  • 主题启动者不知道如何为安全 SQL 准备变量。你推荐了 PDO……这就像从坦克中射杀小鸟一样。
  • @newman 我认为他应该从正确的方式开始。最简单的事情并不总是最好的事情。
  • 是的,这是正确的方法。但是在某些情况下,新手程序员只是复制并通过 sn-p 并且不了解它是如何工作的,因为所有代码都非常困难。对于教育来说,从简单的方法开始,然后了解所有风险。
  • @newman:我绝对不想把它变成关于什么对新手程序员最好的讨论,但是在我的编程课程中,我教我的学生从第一天开始就使用准备好的语句! (只是一个简单的例子......)我确实解释了不使用准备好的语句时所涉及的风险。
【解决方案2】:

考虑使用prepared statements。这是将用户提交的数据输入数据库的最佳方式。它确保数据被正确地自动转义!

phpdata.php

<?php

function doInsert($firstname, $lastname) {
    $insert = "INSERT INTO mytable (firstname, lastname)
                VALUES (?, ?)";
    $pstmt = odbc_prepare($odb_con, $insert); /* Use global $odb_con to access the connection */
    $res = odbc_execute($pstmt, array($firstname, $lastname));
    return $res; /* Should return TRUE on success. */
}

?>

请注意,我的代码中没有包含任何错误检查。实施它可能也是明智之举。

祝你好运!

【讨论】:

  • 看起来几乎与我从@FouadFodail 答案(使用 ODBC)中得出的相同。至于错误检查,是的,我肯定会。我只是试着做一个简单的例子来保持简短和甜蜜。再次感谢!
【解决方案3】:

您可以使用 replace 将所有 ' 替换为 ''。但是,正确的做法是使用参数化查询,您可以在其中将值作为参数插入到 SQL 语句中。然后该语言可以清理 ' 和任何其他可能导致问题的字符/关键字。无论使用哪种语言,参数化查询都是可行的方法。

【讨论】:

    【解决方案4】:

    您可以尝试在插入前使用函数addslashes 准备数据。

    我不知道您是如何使用数据库的,但这个功能是询问您问题的简单方法。

    AddSlashes

    【讨论】:

    • -1 请不要建议使用addlashes。它不是为 SQL 转义字符的正确函数。
    • 这对新手来说很简单。
    • @newman 这也是错误到危险的地步,因为它会产生一种虚假的安全感。
    猜你喜欢
    • 2010-12-27
    • 2011-05-17
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多