0

私はSQLとPHPが初めてです。これまでのところ、問題を解決できましたが、PREPARE ステートメントで構文の問題が発生しています (1 つのステップで複数のことを実行しようとしている可能性があります)。誰かが私の構文が台無しになっている場所を教えてくれたら、それは素晴らしいことです.

さらに、私が書いているコードはサーバー上の保存ファイルを更新しようとしています。準備ステートメントでそれを行うことが正しい方法であると信じていますが、そうでない場合は喜んでお知らせします。INSERT INTO -> 条件付き挿入または更新を変更する予定です。

予期しない T_STRING というエラーが表示されます。コードでエラーの行をマークしました。

$sql='PREPARE statement FROM "INSERT INTO buildings VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) WHERE id="$id" AND ind="$i""';
$result=mysql_query($sql);
for($i=0;$i<1600;$i+=1){
    if(isset($_POST['ind'.$i])){
        $bind=$_POST['bind'.$i];
        $time=$_POST['time'.$i];
        $level=$_POST['level'.$i];
        $p1ind=$_POST['p1ind'.$i];
        $p1state=$_POST['p1state'.$i];
        $p1time=$_POST['p1time'.$i];
        $p2ind=$_POST['p2ind'.$i];
        $p2state=$_POST['p2state'.$i];
        $p2time=$_POST['p2time'.$i];
        $p3ind=$_POST['p3ind'.$i];
        $p3state=$_POST['p3state'.$i];
        $p3time=$_POST['p3time'.$i];
        $p4ind=$_POST['p4ind'.$i];
        $p4state=$_POST['p4state'.$i];
        $p4time=$_POST['p4time'.$i];
        $p5ind=$_POST['p5ind'.$i];
        $p5state=$_POST['p5state'.$i];
        $p5time=$_POST['p5time'.$i];

        $sql = 'SET @bind="$bind",'. //<-line of error
        '@time="$time",'.
        '@level="$level",'.
        '@p1ind="$p1ind",'.
        '@p1state="$p1state",'.
        '@p1time="$p1time",'.
        '@p2ind="$p2ind",'.
        '@p2state="$p2state",'.
        '@p2time="$p2time",'.
        '@p3ind="$p3ind",'.
        '@p3state="$p3state",'.
        '@p3time="$p3time",'.
        '@p4ind="$p4ind",'.
        '@p4state="$p4state",'.
        '@p4time="$p4time",'.
        '@p5ind="$p5ind",'.
        '@p5state="$p5state",'.
        '@p5time="$p5time",'.
        '@id="$id",'.
        '@ind="$i"';
        $result=mysql_query($sql);
        $sql='EXECUTE statement USING @id,@time,@level,@p1ind,@p1state,@p1time,@p2ind,@p2state,@p2time,@p3ind,@p3state,@p3time,@p4ind,@p4state,@p4time,
        @p5ind,@p5state,@p5time,@ind,@bind';
        $result=mysql_query($sql);
        if(!$result){
            die("saveArry[0]=".mysql_error().";");
        }else{
            die("saveArry[0]='saved';");
        }
    }
}
$sql='DEALLOCA PREPARE statement';
$result=mysql_query($sql);

更新ホスト サーバーに PDO をインストールできないため、残念ながら PDO は受け入れられないソリューションです。私の答え(今ではエラーはありません!):

    if(isset($_POST['ind'])){
    $ind=sanitizeString($_POST['ind']);
    $bind=sanitizeString($_POST['bind']);
    $time=sanitizeString($_POST['time']);
    $level=sanitizeString($_POST['level']);
    $p1ind=sanitizeString($_POST['p1ind']);
    $p1state=sanitizeString($_POST['p1state']);
    $p1time=sanitizeString($_POST['p1time']);
    $p2ind=sanitizeString($_POST['p2ind']);
    $p2state=sanitizeString($_POST['p2state']);
    $p2time=sanitizeString($_POST['p2time']);
    $p3ind=sanitizeString($_POST['p3ind']);
    $p3state=sanitizeString($_POST['p3state']);
    $p3time=sanitizeString($_POST['p3time']);
    $p4ind=sanitizeString($_POST['p4ind']);
    $p4state=sanitizeString($_POST['p4state']);
    $p4time=sanitizeString($_POST['p4time']);
    $p5ind=sanitizeString($_POST['p5ind']);
    $p5state=sanitizeString($_POST['p5state']);
    $p5time=sanitizeString($_POST['p5time']);
    $rot=sanitizeString($_POST['rot']);
    $sql="INSERT INTO buildings (id,ind,bind,time,level,p1ind,p1state,p1time,p2ind,p2state,p2time,p3ind,p3state,p3time,p4ind,p4state,p4time,p5ind,
    p5state,p5time,rot) VALUES ('$id','$ind','$bind','$time','$level','$p1ind','$p1state','$p1time','$p2ind','$p2state','$p2time','$p3ind','$p3state',
    '$p3time','$p4ind','$p4state','$p4time','$p5ind','$p5state','$p5time','$rot') ON DUPLICATE KEY UPDATE bind='$bind',time='$time',level='$level',
    p1ind='$p1ind',p1state='$p1state',p1time='$p1time',p2ind='$p2ind',p2state='$p2state',p2time='$p2time',p3ind='$p3ind',p3state='$p3state',
    p3time='$p3time',p4ind='$p4ind',p4state='$p4state',p4time='$p4time',p5ind='$p5ind',p5state='$p5state',p5time='$p5time',rot='$rot'";
    $result=mysql_query($sql);
    if(!$result){
        die("saveArry[0]=".mysql_error().";");
    }else{
        die("saveArry[0]=saved;");
    }
}
4

2 に答える 2

1

非推奨の mysql_* 関数の代わりにPDOを使用することを強くお勧めします。準備されたステートメントを透過的に使用して、大変な作業を行っています。

EthanB がコメントで指摘したように、ユーザー入力 (変数)から値を直接挿入しているため、コードはSQL インジェクションに対して脆弱です。$_POST

PDO を使用すると、コードは次のようになります (簡略化)。

$statement = $pdo->prepare("INSERT INTO buildings VALUES(:ind, :bind, :time, :level, ...) WHERE id = :id AND ind = :ind");

for( ... ) {
    $statement->execute(array(
       ":ind" => $_POST["ind" . $i],
       ":bind" => $_POST["bind" . $i], ...
    ));
}

PDO は PREPARE および EXECUTE クエリを送信し、SQL インジェクションを防ぐためにすべてのパラメーターをエスケープします。

于 2012-11-13T22:48:31.810 に答える
1

その行では、一重引用符と二重引用符が入れ替わっています。

 $sql = "SET @bind='$bind', 
    @time='$time',
    @level='$level',
    @p1ind='$p1ind',
    @p1state='$p1state',
    @p1time='$p1time',
    @p2ind='$p2ind',
    @p2state='$p2state',
    @p2time='$p2time',
    @p3ind='$p3ind',
    @p3state='$p3state',
    @p3time='$p3time',
    @p4ind='$p4ind',
    @p4state='$p4state',
    @p4time='$p4time',
    @p5ind='$p5ind',
    @p5state='$p5state',
    @p5time='$p5time',
    @id='$id',
    @ind='$i'";
于 2012-11-13T22:43:40.670 に答える