2

私はこのSQLクエリを持っています:

SELECT *, ( 3959 * acos( cos( radians(41.832100) ) * cos( radians( latitude ) ) * cos( radians( longitude) - radians(-87.789597) ) + sin( radians(41.832100) ) * sin( radians( latitude ) ) ) ) AS distance FROM cities_extended HAVING distance < 10 ORDER BY distance LIMIT 0 , 5;

phpMyAdmin で実行すると動作します。ただし、 $this->db->query();を介して codeigniter で実装しようとしました。関数。

そのようです :

$nearby_cities = $this->db->query("SELECT city,state,zip, ( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) AS distance FROM cities_extended HAVING distance < 25 ORDER BY distance LIMIT 0 , 3;");

そして私はこれを得る:

Error Number: 1582

Incorrect parameter count in the call to native function 'radians'

SELECT city,state,zip, ( 3959 * acos( cos( radians() ) * cos( radians( latitude ) ) * cos( radians( longitude) - radians() ) + sin( radians() ) * sin( radians( latitude ) ) ) ) AS distance FROM cities_extended HAVING distance < 25 ORDER BY distance LIMIT 0 , 3;

phpmyadminでまったく同じクエリを実行し、mysqlのコマンドラインを介して実行すると機能することは意味がありませんが、phpとcodeigniterでは機能しません。誰でも助けることができますか?

問題が解決しました

$query = sprintf("SELECT *, ( 3959 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance FROM cities_extended HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20",
             mysql_real_escape_string('41.832100'),
             mysql_real_escape_string('-87.789597'),
             mysql_real_escape_string('41.832100'),
             mysql_real_escape_string('25'));

            $nearby_cities = $this->db->query($query);

注: 緯度と経度は、変数ではなくテーブルの列です。ご意見ありがとうございます。

4

4 に答える 4

2

二重引用符内の浮動小数点数がその値に置き換えられると、php はデフォルトでカンマを小数点記号として使用します

$float = 1.234;
$string = "SELECT col FROM table WHERE lat > $float"

になりました

echo $string => SELECT col FROM table WHERE lat > 1,234

それ以外の

echo $string => SELECT col FROM table WHERE lat > 1.234

そのため、MySQL はこれを浮動小数点数としてではなく、数値 1 および構文区切り文字として認識します。

1 つの解決策は、クエリで使用する前に数値を正しい文字列に変換することです。

$float = 1.234;
$float_string = number_format($float, 2, '.', '');
$string = "SELECT col FROM table WHERE lat > $float_string"

number_format() の詳細はこちら

于 2012-05-20T04:04:08.483 に答える
0

$latitudeあなたと$longitude変数が空のように見えます

于 2012-03-16T20:14:32.407 に答える
0

必要なパラメータ値なしでを呼び出しています。度パラメーターを含める必要があります。radians(x)

より明確に、あなたは持つことができません

radians() // Missing value

次のように度引数を含める必要があります。

radians(90) // Converts 90 degrees to radians

さらに、$longitudeand の$latitude値が空でないことを確認してください。

于 2012-03-16T20:21:42.370 に答える
0

これは古い質問だと思いますが、問題は明らかです。

$nearby_cities = $this->db->query("SELECT city,state,zip, ( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - ラジアン($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) AS distance FROMcitys_extended HAVING distance < 25 ORDER BY distance LIMIT 0 , 3;");

関数への 3 つのパラメーターradiansがエスケープされていません$... これは @josh が言っていることだと思いますが、(私には)パラメーターが欠落している理由が明確ではありませんでした。

于 2013-11-15T20:09:03.123 に答える