2

PHP PDO ライブラリとプリペアド ステートメントに少し問題があります。私が見る限り、以下の準備されたステートメントは機能するはずですが、機能しません。代わりに、「PDOStatement::execute(): SQLSTATE[HY093]: 無効なパラメーター番号: バインドされた変数の数がトークンの数と一致しません」というメッセージが表示されます。 .

このセクションの PHP コードは次のようになります。

    $sql = 'INSERT INTO '.POLYGON_TABLE.' (user_id, polygon, polygon_type) VALUES (:userId, PolygonFromText(\'POLYGON((:polygonArea))\'), :polygonType)';

    $sth = $this->pdo->prepare($sql);
    $sth->bindValue(':userId', $polygon->getUserId(), \PDO::PARAM_INT);
    $sth->bindValue(':polygonArea', $polygon->getPolygonAsText(), \PDO::PARAM_STR);
    $sth->bindValue(':polygonType', $polygon->getPolygonType(), \PDO::PARAM_STR);

    if($sth->execute()) {
        return true;
    } else {
        return false;
    }

$polygon->getUserId()、$polygon->getPolygonAsText()、および $polygon->getPolygonType() の var_dump を実行し、以下を取得しました。

    string(1) "1"
    string(226) "53.897910476098765 -1.739655277929728, 53.865530797116 -2.080231449804728, 53.67235280490181 -2.006073734960978, 53.68862047002787 -1.621552250585978, 53.89305512284903 -1.539154789648478, 53.897910476098765 -1.739655277929728"
    string(7) "commute"

問題は $polygon->getPolygonAsText() にあります。これは、この特定の bindValue 呼び出しをコメント アウトし、SQL ステートメントから PolygonFromText(\'POLYGON((:polygonArea))\') を実行すると、クエリが機能するためです。

私は今、完全に途方に暮れています。ここで何が問題なのか知っている人はいますか?$polygon->getPolygonAsText() に含まれるテキストに問題はありません。私はこれに対する解決策を高低で検索し、今晩コードをいじって数時間を費やしましたが、役に立ちませんでした。

これら 2 つのスタック オーバーフロー トピックの提案も試しましたが、どちらも機能しませんでした。

どんな助けでも大歓迎です...

4

3 に答える 3

4

式全体をバインド値として渡そうとしましたか?

$sql = 'INSERT INTO '.POLYGON_TABLE.' (user_id, polygon, polygon_type) VALUES (:userId,  PolygonFromText(:polygonArea), :polygonType)';


$sth = $this->pdo->prepare($sql);
$area = sprintf("POLYGON((%s))", $polygon->getPolygonAsText()); 
$sth->bindValue(':userId', $polygon->getUserId(), \PDO::PARAM_INT);
$sth->bindValue(':polygonArea', $area, \PDO::PARAM_STR);
$sth->bindValue(':polygonType', $polygon->getPolygonType(), \PDO::PARAM_STR);
于 2012-04-20T23:04:43.823 に答える
3

文字列内で名前付きパラメーターを使用しようとしているようです:

PolygonFromText(\'POLYGON((:polygonArea))\')

これは、次のようなことを行うことに似ています。

UPDATE foo SET bar = 'blah blah :wontwork blah blah'

代わりに試す必要があるのは、クエリで文字列全体をバインドすることです。

PolygonFromText(:polygonArea)

そして、残りの文字列をバインドされた値に含めます。

$sth->bindValue(':polygonArea', 'POLYGON((' . $polygon->getPolygonAsText() . '))', \PDO::PARAM_STR);
于 2012-04-20T23:12:58.213 に答える
1

これを行うことができる最後の手段:

$sql = "INSERT INTO ".POLYGON_TABLE." (user_id, polygon, polygon_type) "
     ."VALUES (:userId, PolygonFromText('POLYGON(". $polygon->$getPolygonAsText
     .")'),:polygonType)";

?しかし、最初にパラメーターを試して、それがどのようになるかを確認する必要があると思います。

$sql = "INSERT INTO ".POLYGON_TABLE." (user_id, polygon, polygon_type) "
     ."VALUES (?, PolygonFromText('POLYGON(?)'), ?);";
$data = array($polygon->getUserId(), $polygon->getPolygonAsText(), $polygon->getPolygonType());
$query->execute($data);

ところで、POLYGON(?) 関数を一重引用符で囲むのも危険だと思います...通常、メソッド呼び出しを引用しませんか?

于 2012-04-20T23:07:00.687 に答える