首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使在PDO准备语句和绑定参数之后,也无法在数组中转义单引号

问即使在PDO准备语句和绑定参数之后,也无法在数组中转义单引号
EN

Stack Overflow用户
提问于 2019-04-23 11:10:44
回答 1查看 583关注 0票数 2

我正在处理来自Server和MySQL的两个相同的表,我的最终目标是能够通过PHP同步它们的内容。我为此做了一个previous post,我发现我的代码不起作用的原因是单引号扰乱了我的SQL语法。然后,我将表转换为使用PDO,因为我听到准备语句/绑定param是更有效的。但是,我的代码仍然没有正确地转义单引号。我已经查过过去的帖子了,但没有一个能解决我的问题。以下是代码:

代码语言:javascript
复制
<?php

$serverName = "<servername>";
$connectionInfo_mssql = array("Database"=>"<dbname>", "CharacterSet"=>"UTF-8");

try
  {
    $conn_mssql = new PDO("sqlsrv:Server=$serverName;Database=<dbname>");
    $conn_mssql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $conn_mysql = new PDO("mysql:host=localhost;dbname=<dbname>", "", "");
    $conn_mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


    //SELECT FROM SQL SERVER DB
    $mssql_array = array();
    $mssql_query = $conn_mssql->prepare("SELECT * FROM Customers");
    $mssql_query->execute();

    while($row = $mssql_query->fetch(PDO::FETCH_BOTH))
    {

      $mssql_array[] = array('ID' => $row['ID'], 
                             'Name' => $row["Name"], 
                             'Address' => $row['Address'], 
                             'Email' => $row['Email']);

    }

    foreach($mssql_array as $key => $value)
    {

       //SELECT FROM MySQL DB
       $mysql_query = $conn_mysql->prepare("SELECT COUNT(*) FROM Customers WHERE ID ='".$value['ID']."' 
                                                        AND Name = '".$value["Name"]."' 
                                                        AND Address = '".$value['Address']."' 
                                                        AND Email = '".$value['Email']."' ");
       $mysql_query->execute();
       $num_rows = $mysql_query->fetchColumn();

       if ($num_rows == 0)
                       {
                         //INSERT INTO MySQL DB
                         $sql = $conn_mysql->prepare("INSERT INTO Customers VALUES (:ID, :Name, :Address, :Email)");

                         $params = array(':ID' => $value["ID"], ':Name' => $value["Name"], ':Address' => $value["Address"], ':Email' => $value["Email"]); 
                         $sql->execute($params); //this is where the error occurs
                       }
    }

    echo 'Table Customers from MS SQL DB and table Customers from MySQL DB are now synced!'."<br>";
    echo "<a href='table_updater.php'>Go back to updater</a>";

  }
catch(PDOException $e)
  {
    echo "Error: " . $e->getMessage();
  }

?>

基本上,它选择了Server表的所有内容并将其放入MySQL中,但是由于我的一行的值为"Jojo's“,所以它只会因为单引号而给出一个错误。我所犯的错误是

错误: SQLSTATE42000:语法错误或访问冲突: 1064您的SQL语法出现了错误;检查与MariaDB服务器版本对应的手册,以获得使用“s”和Address =‘IDK’的正确语法。

这很大程度上告诉我我不会逃避单引号。

任何想法都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-23 11:27:28

问题不在于INSERT语句,而在于SELECT语句。从错误中可以看到,它无法解释select查询的一部分。所以正确的代码如下所示:

代码语言:javascript
复制
//SELECT FROM MySQL DB
$mysql_query = $conn_mysql->prepare("SELECT COUNT(*) FROM Customers WHERE ID = :ID
                                                        AND Name = :Name
                                                        AND Address = :Address
                                                        AND Email = :Email ");

$params = [':ID' => $value['ID'], ':Name' => $value['Name'], ':Address' => $value['Address'], ':Email' => $value['Email']];
$mysql_query->execute($params);

为了进一步解释,如果没有占位符,如果名称中有引号,则select查询可能如下所示:

代码语言:javascript
复制
SELECT COUNT(*) FROM Customers WHERE ID = '123'
                            AND Name = 'As'd, dfg'        # <- Problem here
                            AND Address = 'some address'
                            AND Email = 'email@example.com'

对于记录,应始终对代码中不受控制的任何值使用占位符。即使这是用于SELECT语句或您信任的数据源。这防止意外注入和处理任何类型的字符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55809899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档