現在、SQL Serverからデータを要求してユーザーに表示するアプリケーションで作業しています。mySqlからの行の取得PHPによる特定のポイントからの降順
データが表示されているときは、前後にクリックして次または前のデータを表示できます。
ユーザーがデータを受信すると、アプリケーションはローカルマップにキャッシュしてサーバーへの呼び出しを減らします。 キャッシュされたデータが正しく動作するためには、アプリケーションはSQL Serverから各行の最小値と最大値を取得します。
ユーザーがアプリケーションをブラウズしている間に新しいデータが挿入されると、その時点で最大IDが変更されるため、アプリケーションが新しいデータを要求すると、現在の最大IDが評価されるため、そのインデックスはすでに持っているので、最大インデックスは最新のデータを表しているので、ユーザーは重複した行を見ることがあります。
私が考えていた解決策は、インデックス値がキャッシュされた最大インデックス値よりも小さいかどうかをチェックすることによってSQL Serverが取得できる行を制限していますが、これを実装する方法がわかりません。
質問:
行フィールドの値が一定量の下であれば、私はデータのみを取得するためにSQL Serverを照会することができますか?
コード:
$connect=mysqli_connect(HOST,USERNAME,PASSWORD,DB) or die ('error: '. mysql_error());
$MAXID = $_POST['MAX'];
$MINID = $_POST['MIN'];
$ORDERBY_TYPE = $_POST['TYPE'];
$LIMIT = $_POST['LIMIT'];
$OFFSET = $_POST['OFFSET'];
$ORDERBY = "";
$SKIP = false;
switch($ORDERBY_TYPE){
case 0:
$ORDERBY = "ORDER BY RATING";
//$ORDERBY = "WHERE VOTES > 5 ORDER BY RATING" <--- replace the upper line by this line some day
break;
case 1:
$ORDERBY = "ORDER BY ID";
break;
case 2:
$SKIP = true;
break;
default:
$ORDERBY = "ORDER BY ID";
}
$query = "";
if($SKIP)
{
//adding to the minimum id the amount needed to retrive
$MINID += $LIMIT;
//checking if there are more records then the amount needed <--- only in fresh start this is usefull
if($MINID<$MAXID)
{
//getting a random id between the maximun id and the minimum id after adding the amount needed
$randomId = mt_rand($MINID,$MAXID);
//setting offset to be skipped - that is the "distance" between the max id and the random id
$OFFSET = $MAXID - $randomId;
}
else
{
$OFFSET = 0;
}
//getting the amount of records needed after skipping the "random" modefied value
$query = "SELECT * FROM `ugcl` ORDER BY ID DESC LIMIT ". $LIMIT ." OFFSET ". $OFFSET ."";
}
else
{
$query = "SELECT * FROM `ugcl` ". $ORDERBY ." DESC LIMIT ". $LIMIT ." OFFSET ". $OFFSET ."";
}
$result = mysqli_query($connect,$query);
if($result)
{
$fields = array();
$col_query = "SHOW COLUMNS FROM `ugcl`";
$col_result = mysqli_query($connect,$col_query);
while($row = mysqli_fetch_array($col_result)){
array_push($fields, $row['Field']);
}
$fake_count = 0;
echo "[";
while ($array = mysqli_fetch_row($result)) {
echo "{";
echo '"';
echo $fake_count;
echo '"';
echo ":";
echo "{";
for($i = 0 ; $i < count($array) ; $i++){
if($i > 0) echo ",";
echo '"';
echo $fields[$i];
echo '"';
echo ":";
echo '"';
echo $array[$i];
echo '"';
}
echo "}";
echo "},";
$fake_count++;
}
echo "]";
}
else
{
echo "error";
}
発明ホイールを停止します。最後の__30__行で行うすべてを行う 'json_encode'関数があります。 –
@u_mulder私はjson_encodeを試しましたが、各行のフィールドの1つは1k文字以上のjsonです。json_encodeを使用すると、そのフィールドのデータが乱され、 "\" charが追加されました。私のアプリで正しい方法で、私はちょうど私の自己それをやった。しかし、どうもありがとうございます:) – gggggguy
あなたのデータベースがSQL ServerかMySQLかどうかを明確にしてください。適切でないタグを削除します。 – Alex