2012-04-20 18 views
1

PHP PDOライブラリとプリペアドステートメントに多少の問題があります。 「PDOStatement :: execute():SQLSTATE [HY093]:無効なパラメータ番号:バインドされた変数の数がトークンの数と一致しません」というメッセージが表示されている限り、 。このセクションのPHP PDOプリペアドステートメントとバウンドバインドで無効なパラメータ番号エラーが発生する

私のPHPコードは次のようになります。私は$ polygon-ののvar_dumpを行っている

$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; 
    } 

> getUserId()、$ polygon-> getPolygonAsText()と$ polygon-> getPolygonType()と取得以下:

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コールとPolygonFromTextコメントアウトとして(\ 'POLYGON((:polygonArea))\')からSQL文原因をクエリが機能します。

私は今や完全に迷っています。誰でもここで何が間違っているか知っていますか私は$ polygon-> getPolygonAsText()に含まれるテキストに間違ったものは見当たりません。私はこの問題を解決するために最高と最低を探し、今晩コードを使って数時間を過ごしましたが、無駄にしませんでした。

私もこれらの2スタックオーバーフローのトピックでの提案を試してみましたが、彼らはどちらか動作しませんでした:

すべてのヘルプははるかに高く評価されるだろう...

+0

「PolygonFromText」とは何ですか? – Starx

+0

Googleそれは、MySQLの地理空間的なものの一部です。 –

+0

'PolygonFromText(\ 'POLYGON(:polygonArea))')'余分な角括弧を削除してみてください。 – Starx

答えて

2

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

$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); 
+0

聖なるくそ。どうもありがとうございました。働いた! –

1

あなたがこれを行うことができます最終リゾート:

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

しかし、私は、あなたが最初に?のparamsを試してみて、それが行く方法を確認すべきだと思います。

$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(?)機能の周りの人々単一引用符が怪しいと思いますか?

+0

申し訳ありませんが、私はまた試したことを忘れましたか? paramsと同じ問題が発生しました。 –

+0

@GarryWelding Oh ok ... 'POLYGON(:polygonArea)'の回りに一重引用符を削除しようとしましたか? – Ozzy

+0

POLYGON()ビットが実際には文字列であることを意味する "FromText"関数であるため、一重引用符が必要です。 –

3

あなたが、文字列内の名前付きパラメータを使用しようとしていることが表示されます:

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

これは、このような何かをやってに似て、次のようになります。

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

あなたの代わりに試してみてください何ですかクエリ内の文字列全体をバインドします。

PolygonFromText(:polygonArea) 

そして残りの文字列バインドされた値:

$sth->bindValue(':polygonArea', 'POLYGON((' . $polygon->getPolygonAsText() . '))', \PDO::PARAM_STR); 
関連する問題