2010-12-07 15 views
0

SQL構文:変数をSQLクエリに渡す

これは私の最初のプログラムであり、この質問に答えるための広範な研究を行っており、私は問題を解決できません:

<?php 

    include "connect.php"; 

    if (!$connection) 
     { 
     die('Could not connect: ' . mysql_error()); 
     } 

    $submit = $_POST["submit"]; 

    if ($submit=="Submit") { 
     $date = $_POST["date"]; 
     $name = $_POST["name"]; 
     $activity = $_POST["activity"]; 
     $activity_level = $_POST["activity_level"]; 

    $find_role = ("SELECT sales_role 
        FROM role 
       LEFT JOIN USER on user.role_id = role.id 
        WHERE user.user = '$name'"); 
    $find_activity_points = ("SELECT $activity_$role 
           FROM $activity 
           WHERE activity_level = '$activity_level'"); 

    $role = mysql_query($find_role); 

    $activity_points = mysql_query($find_activity_points); 
    if ($activity_points !== false) { 
    } 
     else { 
     echo mysql_error(); 
     die; 
    } 

    $convert_activity_points = array(); 

    while ($row = mysql_fetch_array($activity_points, MYSQL_ASSOC)) { 
     $convert_activity_points[] = $row; 
    } 



    $set_points = "UPDATE $name SET $activity='$convert_activity_points' WHERE day='$date'"; 
    mysql_query($set_points); 


    } 

    mysql_close($connection); 

    ?> 

そしてこれはform.phpを提出して更新するときのエラーメッセージです。 php: SQL構文に誤りがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックしてください。正しい構文については、 'FROM dialer WHERE activity_level = '70'の近くの行1で使用してください。

P.S.私はSQLインジェクションの脆弱性があることを知っていますが、私はこのプログラムを使用する唯一の人であり、私は自分のコンピュータ上でローカルに使用しています。私は今、脆弱性は大丈夫です。

テーブルを0で更新し、エラーメッセージを表示しません。 SQLインジェクションの脆弱性、オリジナルのPS文

を参照
+0

mysqlに渡されるsqlクエリは、 'echo'だけ見たことがありますか?また、なぜ '(" foo bar ")'のような文字列のまわりにかっこを追加しましたか? – zerkms

+0

'activity_level'は数値型ですか? '70'の引用符でもかまいませんか? – AgentConundrum

+0

誤字の可能性があります: "$ activity_ $ role" –

答えて

-1

を参照してください。

mysql_query("SELECT * FROM `someTable` WHERE `someValue`='".$someVar'"); 
  • そして$_POST["activity_level"]はそれで'の文字列です。

ソリューション:この行で

"SELECT `".$activity_$role."` FROM `".$activity."` WHERE `activity_level`='".mysql_real_escape_string($activity_level)."'" 
+0

クエリが連結/置換されているようです – AgentConundrum

0

$find_activity_points = ("SELECT $activity_$role FROM $activity WHERE activity_level='$activity_level'"); 

私はあなたが前に、クエリの実行に$roleの値を定義し、あなたのコードのどこにでも見ることができません。だから、

、あなたのSELECT文は次のようなものに見えるかもしれ$activity == 'Eating'と仮定:私は、MySQLがテーブル/カラム名で$文字を許可しないと考えているように、これはあなたのエラーにつながる可能性があり

SELECT Eating_$role FROM Eating WHERE activity_level='...' 

を。

Babikerが示唆しているように、sprintf()を連結または使用すると、これらのさまざまな問題の解決に役立ちます。


編集:コメントであなたの質問に答えてください。

他のが述べたように

、次のようなものにあなたの$find_activity_points行を変更します。心に留めておくべき

$find_activity_points = ("SELECT " . $activity . "_" . $role . " FROM " . $activity . " WHERE activity_level='" . $activity_level . "'"); 

一つのことを、あなたは(SQL文の連結を行うときに$活動を「SELECT」です。 ")私の例のように、自分自身をSQL Injectionの攻撃で開きます。

+0

おそらく間違っているのは、 'role'の前に' $ 'を置いています。コード内のどこかで' sales_role'フィールドを参照しているので、おそらく$アクティビティです。_role "'(つまり、あなたの例を使って 'Eating_role') – AgentConundrum

+0

列名の形式はactivity_roleなので、ダイヤルテーブルはdial_sdr、dial_ae、dial_outboundなどとなり、convo_sdr、convo_ae、convo_outboundなどとなります。 – Katherine

+0

データベースをセットアップするばかばかしい方法だと思われますが、コンテストの方法のために他の構造を使用するかどうかはわかりませんでしたが、同じ活動の役割に基づいて異なる点が与えられました。 XAMPLE: – Katherine

0

$ロールはプログラムの後半になるまで定義されていませんし、それでもスカラー値ではないのでクエリも損なわれます。変数が値を持つ前に使用しようとしています。そのようには動作しません。一度文字列が設定されると、宣言された時点でそれらの変数の値が格納されます。

あなたはおそらくsprintfを使用します。もちろん http://php.net/manual/en/function.sprintf.php

$find_activity_points = "SELECT %s_%s FROM %s WHERE activity_level='%d'"; 

そして

$activity_points = mysql_query(
    sprintf($find_activity_points, //the main string 
     $activity, $role, $activity, $activity_level) //the "arguments" 
); 

、あなたはまだ$roleは、文字列の中で適切に処理することができます(スカラー)値であることを取得する必要があります。これを行う1つの(やや危険な、しかし速い)方法は次のようになります。

一見
list($role) = mysql_fetch_array(mysql_query($find_role)); 
+0

$ find_role = "SELECT sales_role FROM role LEFT JOIN USER.role_id = role.id上のユーザーWHERE user。ユーザー= '$ name' を "; \t $ find_activity_points = "SELECT%S_%sの$の活動からACTIVITY_LEVEL = '%d個'"; \t \t リスト($の役割)=は、mysql_fetch_array(するmysql_query($ find_role)) ; $ activity_points =するmysql_query( のsprintf($をfind_activity_points、//メインの文字列 $活動、$の役割、$活動は、$ ACTIVITY_LEVEL)// "引数" ); \t \t \t場合($ activity_points!== false){ \t} \t \t else { \t \t \t echo mysql_error(); \t \t \tダイ; \t} – Katherine

+0

私には、$ find_activity_points文字列の$アクティビティも "%s"である必要があります。これは私の答えで修正されている、あなたの現在のコードで変更しようとすると動作するはずです。 活動レベルform.phpから – aaronofleonard

0

、私は「多分」ACTIVITY_LEVELデータ型は文字列が、数ではないと思われます。だから、配置する必要はありません「...」WHERE ACTIVITY_LEVEL = 『$のACTIVITY_LEVEL』

編集中:問題を引き起こすかについて確認するために、私は例hereのように、ログをお勧めします。クラスをインクルードして、ファイルに(非常に簡単に)クエリを記録してから、クエリ自体を調べてください。

+0




Katherine

+0

私は何を意味するACTIVITY_LEVELはnumber-で、あなたのデータベースに多分ありますタイプ。これはフォームに関するものではありません。 –

+0

問合せを実行する前に、ログに記録することを強くお勧めします。そうすれば、正しい答えを得るのがずっと簡単になります。 –