我如何编写一个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;
}
答案 0 :(得分:4)
将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();
Doc:PHP Data Objects
答案 1 :(得分:2)
您可以使用替换来替换所有'with''。但是,正确的方法是使用参数化查询,您可以将值作为参数传递给SQL语句。然后语言可以清理'和任何其他可能导致问题的字符/关键字。无论语言如何,参数化查询都是可行的方法。
答案 2 :(得分: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. */
}
?>
请注意我的代码中没有包含任何错误检查。也可能明智地实施它。
祝你好运!答案 3 :(得分:-4)