そのため、この問題は多くの原因の 1 つとして発生する可能性があります。これが私の状況です。
ラックスペース ロード バランサーを介してラックスペース データベースに接続するホスト Web サイトとして ec2 サーバーを使用しています (ラックスペース外のソースからのデータベースへの接続は許可されません)。
とにかく、私の問題は、挿入時にmysqlテーブルをエンコードし、選択時にデコードしようとしていることです。挿入に使用するコードは次のとおりです。
function mysql_insert_sanitize_encrypt_store($databaseName,$names,$values,$link){
$query="INSERT INTO ".$databaseName." (";
foreach($names as $name){
$query=$query.$name.",";
}
$query[strlen($query)-1]=")"; //replace trailing comma with parenthesis
$query=$query." VALUES (";
foreach($values as $value){
$sanivalue=filter_var($value,FILTER_SANITIZE_URL);
$query=$query."ENCODE('".$sanivalue."','encryptionstring'),";
}
$query[strlen($query)-1]=")";
echo $query;
if(mysql_query($query,$link)){
return 1;
}
}
次のようなクエリを生成します。
INSERT INTO PublishedItems (PublisherUrl,Age,option,experience,goals,gender,minstaken,Item) VALUES (ENCODE('https://www.google.com/profiles/100571329423938175195','encryptionstring'),ENCODE('18-30,30-45','encryptionstring'),ENCODE('15-30','encryptionstring'),ENCODE('novice,amateur','encryptionstring'),ENCODE('Loseweight','encryptionstring'),ENCODE('male','encryptionstring'),ENCODE('120','encryptionstring'),ENCODE('[[{"name":"MW350","value":""},{"name":"MD350","value":""}]]','encryptionstring'))
これは挿入の成功として返されます。
データを再度取得しようとすると、次のコードを使用します。
$query="select ".$decryptionQueries[$count++]." FROM ".$DBName;
mysql_free_result($result);
$result=mysql_query($query,$link);
echo "</br>";
echo $query;
echo "</br>";
echo "decrypted result --->";
var_dump($result);
echo "</br>";
echo "</br>============".$DBName."============UNENCRYPTED=========</br>";
while($row=mysql_fetch_array($result)){
echo "</br>";
var_dump($row);
echo "</br>";
echo "<pre>" . print_r(get_defined_vars(),true) . "</pre>";
}
ここで、復号化クエリは次のように定義されます。
$decryptionQueries=array("DECODE(PublisherUrl, 'encryptionstring'), DECODE(Age,'encryptionstring'), DECODE(option,'encryptionstring'), DECODE(experience,'encryptionstring'), DECODE(goals,'encryptionstring'), DECODE(gender,'encryptionstring'),DECODE(minstaken,'encryptionstring'), DECODE(Item,'encryptionstring')","DECODE(User,'encryptionstring'), DECODE(Age,'encryptionstring'), DECODE(option,'encryptionstring'), DECODE(experience,'encryptionstring'), DECODE(goals,'encryptionstring'),DECODE(gender,'encryptionstring'), DECODE(Injuries,'encryptionstring'), DECODE(availperday,'encryptionstring'), DECODE(Item,'encryptionstring')");
これにより、次のようなクエリが生成されます。
select DECODE(PublisherUrl, 'encryptionstring'), DECODE(Age,'encryptionstring'), DECODE(option,'encryptionstring'), DECODE(experience,'encryptionstring'), DECODE(goals,'encryptionstring'), DECODE(gender,'encryptionstring'),DECODE(minstaken,'encryptionstring'), DECODE(Item,'encryptionstring') FROM PublishedItems
しかし、データを表示すると、rows 変数の定義済み変数エントリは次のようになります。
[row] => Array
(
[0] => h
[DECODE(PublisherUrl, 'encryptionstring')] => h
[1] => 18-3
[DECODE(Age,'encryptionstring')] => 18-3
[2] => 15-3
[DECODE(option,'encryptionstring')] => 15-3
[3] =>
[DECODE(experience,'encryptionstring')] =>
[4] =>
[DECODE(goals,'encryptionstring')] =>
[5] => male
[DECODE(gender,'encryptionstring')] => male
[6] => 1
[DECODE(minstaken,'encryptionstring')] => 1
[7] => [
[DECODE(Item,'encryptionstring')] => [
私の質問は: データベースに保存されている文字列の一部のみを返すのはなぜですか? または、なぜ文字列の一部だけを保存するのでしょうか? 私のコードで何が問題になっていますか? エンコードとデコードと関係がありますか?
入力が最初にエンコードされず、データベースから選択されただけの場合、正しく完全に返されるので、エンコードとデコードに関係があると思います。
何が問題だと思いますか?
編集:
テーブルの 1 つの行を反復処理すると、次の出力が得られます (行を var_dumped しただけです)。
============PublishedItems============ENCRYPTED=========
array(9) { ["PublisherUrl"]=> string(1) "A" ["Age"]=> string(3) "7b?" ["option"]=> string(3) "7C?" ["experience"]=> string(0) "" ["goals"]=> string(0) "" ["gender"]=> string(4) " ¬'" ["minsTaken"]=> string(1) "7" ["Item"]=> string(1) "-" ["DateSubmitted"]=> string(19) "2012-09-14 21:05:57" }
array(9) { ["PublisherUrl"]=> string(1) "A" ["Age"]=> string(3) "7b?" ["option"]=> string(3) "7C?" ["experience"]=> string(0) "" ["goals"]=> string(1) " " ["gender"]=> string(5) " ¬'#" ["minsTaken"]=> string(1) "7" ["Item"]=> string(1) "-" ["DateSubmitted"]=> string(19) "2012-09-14 21:10:41" }
array(9) { ["PublisherUrl"]=> string(1) "A" ["Age"]=> string(3) "7b?" ["option"]=> string(3) "7C?" ["experience"]=> string(0) "" ["goals"]=> string(1) " " ["gender"]=> string(5) " ¬'#" ["minsTaken"]=> string(1) "0" ["Item"]=> string(1) "-" ["DateSubmitted"]=> string(19) "2012-09-14 21:16:55" }
array(9) { ["PublisherUrl"]=> string(1) "A" ["Age"]=> string(3) "7b?" ["option"]=> string(3) "7C?" ["experience"]=> string(0) "" ["goals"]=> string(1) " " ["gender"]=> string(4) " ¬'" ["minsTaken"]=> string(1) "7" ["Item"]=> string(1) "-" ["DateSubmitted"]=> string(19) "2012-09-14 22:34:14" }
array(9) { ["PublisherUrl"]=> string(53) "https://www.google.com/profiles/100571329423938175195" ["Age"]=> string(3) "45+" ["option"]=> string(7) "below15" ["experience"]=> string(6) "novice" ["goals"]=> string(10) "Loseweight" ["gender"]=> string(4) "male" ["minsTaken"]=> string(3) "120" ["Item"]=> string(59) "[[{"name":"MW484","value":""},{"name":"MD484","value":""}]]" ["DateSubmitted"]=> string(19) "2012-09-14 22:49:41" }
array(9) { ["PublisherUrl"]=> string(53) "https://www.google.com/profiles/100571329423938175195" ["Age"]=> string(3) "45+" ["option"]=> string(8) "below15," ["experience"]=> string(6) "novice" ["goals"]=> string(10) "Loseweight" ["gender"]=> string(4) "male" ["minsTaken"]=> string(3) "120" ["Item"]=> string(117) "[[{"name":"MW310","value":""},{"name":"MD310","value":""}],[{"name":"MW900","value":""},{"name":"MD900","value":""}]]" ["DateSubmitted"]=> string(19) "2012-09-14 22:50:19" }
array(9) { ["PublisherUrl"]=> string(1) "A" ["Age"]=> string(2) "vS" ["option"]=> string(0) "" ["experience"]=> string(0) "" ["goals"]=> string(0) "" ["gender"]=> string(4) " ¬'" ["minsTaken"]=> string(1) "7" ["Item"]=> string(1) "-" ["DateSubmitted"]=> string(19) "2012-09-14 23:50:32" }
一部の文字列が暗号化されていないことに注意してください。私はこれをコントロールとして行いました。これは、エンコーディングの挿入が問題であることを示唆していますが、挿入用のクエリ文字列 (2 番目のコード スニペットを参照) がどのようになるかはわかりません。メッセージの一部のみを挿入します。これらの文字列を復号化すると、部分的な文字列が得られますが、全体が正しい場合は正しいでしょう。
さらに、テーブルの宣言は次のとおりです。
create table PublishedItemss (PublisherUrl char(150),Age char(5),option char(8),experience char(20), goals char(50), gender char(8), minsTaken int, item TEXT,DateSubmitted timestamp NOT NULL DEFAULT NOW())';