撇号未插入SQL数据库

时间:2014-01-16 13:09:30

标签: php sql sql-server pdo

我正在使用PHP使用sqlsrv驱动程序连接SQL数据库。但是,我遇到了一个问题:

$string = "Home";
$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('" .$string. "')" );
$DBH->execute();

这是怎么回事?

$string = "Home's";
$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('" .$string. "')" );
$DBH->execute();

但这不是吗?

SQL数据库似乎不接受$string变量中的撇号。在过去,我会使用mysql_real_escape_string,但这不是一种选择。

3 个答案:

答案 0 :(得分:2)

这是因为您正在使用预准备语句...但没有准备任何输入,而只是将值打到SQL中。看它应该说清楚:

前1:

$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('Home')" );

前2:

$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('Home's')" );

看看你的报价现在搞砸了?

执行此操作的正确方法是实际使用预准备语句的功能:

$string = "Home's";
$DBH->prepare( "INSERT INTO table_name (column_name) VALUES (:column_name)" );
$DBH->bindParam(':column_name', $string);
$DBH->execute();

请注意您的语句是如何准备好:column_name参数准备接受值的。然后bindParam将值放入并执行。

现在甚至可以使用新值重用prepare:

$string = "Home's Holmes is homing";
$DBH->execute();

答案 1 :(得分:0)

sqlsrv documentation page在如何使用准备好的陈述方面有很好的例子:

$sql = "INSERT INTO table_name (column_name) VALUES (?)";
$params = array("Home's");    
$stmt = sqlsrv_query( $conn, $sql, $params);

答案 2 :(得分:-1)

我认为你需要使用双撇号来逃避撇号。在执行插入操作后,检查表中的数据,它应该只显示一个撇号。

$string = "Home''s"; 
$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('" .$string. "')" );
$DBH->execute();
祝你好运......