【问题标题】:Php PDO sql statement with single quotes带单引号的 PHP PDO sql 语句
【发布时间】:2013-03-21 21:47:23
【问题描述】:

我有一个带有单引号的 mysql php pdo 语句来调用 Mysql Geolocation "POINT" 函数。

    $sql = "INSERT INTO userTrip 
        (userId, fromLat, fromLon, fromLoc, fromPOI,
        toLat, toLon, toLoc, toPOI,
        tripFinished, isMatched, departureTime, createdAt)
        values 
        (:user,:fromLat,:fromLon, GeomFromText('POINT(:fromLat1 :fromLon1)'),:fromPOI,:toLat,
        :toLon, GeomFromText('POINT(:toLat1 :toLon1)'),:toPOI,0,0,:departureTime,:date)";

    $stmt = $db->prepare($sql);        

    $stmt->bindParam(':user', $userId, PDO::PARAM_INT);
    $stmt->bindParam(':fromLat', $fromLat, PDO::PARAM_STR);
    $stmt->bindParam(':fromLon', $fromLon, PDO::PARAM_STR);
    $stmt->bindParam(":fromLat1", $fromLat, PDO::PARAM_STR);
    $stmt->bindParam(':fromLon1', $fromLon, PDO::PARAM_STR);
    $stmt->bindParam(':fromPOI', $fromPOI, PDO::PARAM_STR);
    $stmt->bindParam(':toLat', $toLat, PDO::PARAM_STR);
    $stmt->bindParam(':toLon', $toLon, PDO::PARAM_STR);        
    $stmt->bindParam(':toLat1', $toLat, PDO::PARAM_STR);        
    $stmt->bindParam(':toLon1', $toLon, PDO::PARAM_STR); 
    $stmt->bindParam(':toPOI', $toPOI, PDO::PARAM_STR);
    $stmt->bindParam(':departureTime', $departureTime, PDO::PARAM_STR);
    $stmt->bindParam(':date', date('Y-m-d H:i:s'), PDO::PARAM_STR);

当我执行查询时,它会抛出异常“PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens”即使参数的数量是正确的。我怀疑单引号会引发查询,但我需要将它们放入。我尝试使用反斜杠和我能想到的所有其他方式转义它们,但查询不会执行。有没有办法解决这个问题?

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    您不需要引号。您需要将参数传递给函数。这就是准备好的语句的用途。

    先定义一个值

    $point = "POINT($fromLat $fromLon)";
    

    然后以通常的方式准备您的查询

    ..., GeomFromText(:point), ...
    

    然后将此 $point 变量绑定到 :point 占位符。

    【讨论】:

    【解决方案2】:

    如果你需要在 SQL 字符串中嵌入单引号,这个

    (:user,:fromLat,:fromLon, GeomFromText('POINT(:fromLat1 :fromLon1)'),:fromPOI,:toLat,
    

    可能需要这样。

    (:user,:fromLat,:fromLon, GeomFromText(''POINT(:fromLat1 :fromLon1)''),:fromPOI,:toLat,
    -- Two single quotes                   ^^                          ^^ 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多