0

私はデータベースを持っています。以前に構築されていなかった場合、DB に 1 つの行のみを含むテーブルを作成しました。

1行しかないのは、情報を保持するために使用するためです。

session idTYPE NVARCHAR(100)を保存するために使用したいフィールドがあり、ここで頭痛の種になります。

phpmyadminから取得したセッションIDを使用して、適切にINSERT(チェックに使用し、空白です)およびUPDATE(構文エラー...)することさえできないようsession_id()ですstring

私の行動に関連する私のコードの一部は次のとおりです。

//uamip,uamport is in URL;I use $_GET[]

$_SESSION[uamport] = $_GET['uamport'];

$_SESSION[uamip] = $_GET['uamip'];

**$_SESSION[sid] = session_id();**

//construct

$sql="CREATE TABLE trans_vector(

        `index` INT NOT NULL AUTO_INCREMENT, 
        `sid` NVARCHAR(100),
        `uamip` CHAR(15),
        `uamport` INT,
        PRIMARY KEY (`index`)
      )" ;

mysql_query($sql);

//insert(first time, so not constructed)

$sql="INSERT INTO trans_vector (sid,uamip,uamport) VALUES(

       '$_SESSION[sid]',
       '$_SESSION[myuamip]',
       '$_SESSION[myuamport]'
     )";

mysql_query($sql);

//update(from 2nd time and later, table exists, so I want to update the sid part)

$sql="UPDATE trans_vector SET sid="**.**$_SESSION[sid];

mysql_query($sql)

今、phpmyadmin を使用してsid fieldafterINSERTまたはを確認するとUPDATE空白です。

しかし、私がこれを行うと:

$vector=mysql_fetch_array(mysql_query("SELECT TABLES LIKE 'trans_vector'"));

そしてecho $vector[sid]、それはウェブページに印刷されます。

別の質問は次のとおりです。

上記のUPDATEステートメントでは、常に次のようなエラーが発生します。

「不明な列 xxxxxx....(いくつかのセッション ID が返されました。常に最初に変換して SQL ステートメントに入れているようです。**それを列 NAME** として扱います。これは私が望んでいるものではありません!)」

CREATE ステートメントでいくつかの TYPE を試しました。また、UPDATE ステートメントの多くの構文 (すべて!!!) も試しましたが、常にこのエラーが発生します。

後者の値が実際に必要なものである変数を含む文字列表現に問題を抱えて'います...おそらく問題は、CREATEの型とUPDATEステートメントの文字列表現から発生しますか?

CAST()ステートメントは私にとって役に立ちますか?

私がこれに対処するのを手伝ってくれることを願っています...そしておそらくそのような問題の実際の参考文献をPHP.

本当にありがとう!!

4

2 に答える 2

2
$insert = "INSERT INTO trans_vector (`sid`, `uamip`, `uamport`) VALUES(

       '".$_SESSION["sid"]."',
       '".$_SESSION["myuamip"]."',
       '".$_SESSION["myuamport"]."'
     )";

これにより、エラーではないにしても、少なくともいくつかの警告が解決されるはずです。

そしてアップデートへ…

$update = "UPDATE trans_vector SET `sid`='".$_SESSION["sid"]."';";

コードに関する注意事項: 配列値は、演算子 '.' を使用して文字列に入れる必要があります。直接挿入することはできません。配列インデックスは、文字列 (" に注意) または整数でなければなりません。

列名は `` で囲みます。SQL で文字列を挿入するには、文字列を ''s に入れる必要があります。これにより、パーサーは文字列と列名を認識します。なしでは、パーサーは列を記述していると想定しています。

mysql_escape_string については、セッションにデータを保存する前にそれを処理すると仮定しました。それらがないと、不要な SQL インジェクションが発生する可能性があります。それを行っていない場合は、(クエリを作成する前に) 次のいずれかを行うことができます。

foreach($_SESSION as $key => $value)
    $_SESSION[$key] = mysql_escape_string($value);

または、クエリを作成するときに文字列を手動でエスケープします。

于 2013-04-05T12:31:21.063 に答える
0

update ステートメントに関しては、アポストロフィが欠落していることは明らかです。データベースに文字列値を挿入する場合は、常にアポストロフィが必要です。また、使用する必要がありますmysql_real_escape_stringmysqlただし、標準は推奨されておらず、PHP の新しいバージョンでは削除され、MySQLi と PDO が優先されていると思います。したがって、すぐに MySQLi または PDO に切り替える必要があります。

内の値を参照する場合も、アポストロフィを使用する必要があります$_SESSION。それ以外の場合、PHP はその名前で定数を見つけようとしsid、後で string にフォールバックします'sid'siddefinedという定数が実際に存在すると、問題が発生します。

ここで、mysql ライブラリの修正された update ステートメントは次のとおりです。

$sql = "UPDATE trans_vector SET sid='" . mysql_real_escape_string($_SESSION['sid']) . "'";

さらに良い:

$sql = "UPDATE `trans_vector` SET `sid`='" . mysql_real_escape_string($_SESSION['sid']) . "'";

バックティックを使用すると、これが列名であることが MySQL で明確になります。場合によっては、SQL の予約済みキーワードのように呼び出される列名を使用することがあります。次に、アポストロフィが必要になります。order一般的な例は、一連のエントリに対して呼び出される列です。

于 2013-04-05T12:37:46.310 に答える