SQL Query tek tırnak

5 Cevap php

Im bir veritabanını güncellemek için kullanılan bir php komut dosyası yazıyorum ama bunun çizgisinde bir hata döndürür sorgu çalıştırmak çalıştığında hata veriyor

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id=15"' at line 1

Diyor Nerede "kullanmak için yakın" veri bir boşluk var sonra sorgu bölümünü görüntülemek gibi görünüyor. Im i (hatta tırnak kaçan) onları koymak çalıştığınızda php değişkenleri ancak sorguya veri i script hataları ayrıştırmak nereden tek tırnak koymak gerekir varsayarak

SQL Query

    mysql_query("UPDATE Videos SET Title=".$_POST['Title'].", Preacher=".$_POST['Preacher'].", Date=".$_POST['Date'].", Service=".$_POST['Service'].", File=".$_POST['File'].", Description=".$_POST['Description']."WHERE id=".$_GET['vid_id']."\"") or die(mysql_error());

Herhangi bir yardım için şimdiden teşekkürler

5 Cevap

Düzgün değişkenleri kaçış ve tek tırnak onları çevreleyen gerekir:

mysql_query("UPDATE
                Videos
            SET
                Title = '".mysql_real_escape_string($_POST['Title'])."',
                Preacher = '".mysql_real_escape_string($_POST['Preacher'])."', 
                Date = '".mysql_real_escape_string($_POST['Date'])."',
                Service = '".mysql_real_escape_string($_POST['Service'])."',
                File = '".mysql_real_escape_string($_POST['File'])."',
                Description = '".mysql_real_escape_string($_POST['Description'])."'
            WHERE
                id = '".mysql_real_escape_string($_GET['vid_id'])."'")
or die(mysql_error());

Düzgün değişkenleri kaçan olmadan, SQL injection attacks savunmasız kendinizi yapıyoruz.

EDIT

Yukarıdaki basitleştirmek için, bir kaç hile yapabilirsiniz:

// Apply mysql_escape_string to every item in $_POST
array_map('mysql_real_escape_string', $_POST);
// Get rid of $_POST, $_POST['Title'] becomes $p_Title
extract($_POST, EXTR_PREFIX_ALL, 'p_');

// Use sprintf to build your query
$query = sprintf("UPDATE
                Videos
            SET
                Title = '%s',
                Preacher = '%s', 
                Date = '%s',
                Service = '%s',
                File = '%s',
                Description = '%s'
            WHERE
                id = '%s'",
            $p_Title,
            $p_Preacher,
            $p_Service,
            $p_File,
            $p_Description,
            mysql_real_escape_string($_GET['vid_id']));

mysql_query($query) or die(mysql_error());

$ _POST Ve $ _GET değişkenleri karıştırma teşvik unutmayın. Sen şeklinde bir gizli giriş alan üzerinden güncelleme kimliğini vermelidir.

mysql_real_escape_string() and sql injections have already been mentioned.
But right now your script (painstakingly) has to mix the sql statement with the data/parameters and in the next step the MySQL server has to separate the data from the statement.
Using (server-side) prepared statements both "parts" of your query are sent separately and the sql parser (of your MySQL server) can never get "confused" about where the statement ends and the data begins.

php-mysql modül hazırlanmış deyimleri biliyorum ama php-mysqli and PDO yapmaz.

$pdo = new PDO('mysql:host=localhost;dbname=test', '...', '...'); 
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$stmt = $pdo->prepare('
  UPDATE
    Videos
  SET
    Title=:title ,
    Preacher=:preacher ,
    Date=:date ,
    Service=:service ,
    File=:file ,
    Description=:description
  WHERE
    id=:id
');
$stmt->bindParam(':title', $_POST['title']);
$stmt->bindParam(':preacher', $_POST['preacher']);
$stmt->bindParam(':date', $_POST['date']);
$stmt->bindParam(':service', $_POST['service']);
$stmt->bindParam(':file', $_POST['file']);
$stmt->bindParam(':description', $_POST['description']);
$stmt->bindParam(':id', $_GET['id']); // really _GET?
$stmt->execute();

Eğer sadece tek bir operasyon için $ stmt kullanırsanız kabartmak bir sürü gibi görünebilir. Ama aksi takdirde her bir parametre için mysql_real_escape_string () aramak zorunda olduğunu düşünün.

(Hiçbir DB soyutlama düzeyi) doğrudan DB API kullanarak olarak en iyi çözüm DB kaçış işlevini kullanmaktır.

Sadece kullanımı mysql_real_escape_string() .

<?php
// Your query
$query = sprintf("UPDATE Videos SET Title='%s', preacher='%s', Date='%s', "
                     ."Service='%s', File='%s', Description='%s' WHERE id='%s'",
                 mysql_real_escape_string($_POST['Title']),
                 mysql_real_escape_string($_POST['Preacher']),
                 mysql_real_escape_string($_POST['Date']),
                 mysql_real_escape_string($_POST['Service']),
                 mysql_real_escape_string($_POST['File']),
                 mysql_real_escape_string($_POST['Description']),
                 mysql_real_escape_string(($_GET['vid_id']));
?>

Bir bonus olarak SQL INJECTION attacs, önceki kod eğilimli karşı gerçekten geliştirilmiş güvenlik alırsınız.

Sadece kaçmak istiyorum durumda bölü size addslashes() Bu durumda iş yapacak php / mysql fonksiyonlarını kullanabilmek için, yine var.

Neden sonunda \" hakkına koyarak, bu SQL sonuna bir " koyar ama başında biri yok?

Bu deneyin:

mysql_query("UPDATE Videos SET Title=".$_POST['Title'].", Preacher=".$_POST['Preacher'].", Date=".$_POST['Date'].", Service=".$_POST['Service'].", File=".$_POST['File'].", Description=".$_POST['Description']."WHERE id=".$_GET['vid_id']) or die(mysql_error());

KALDIR \ "dan:

id=".$_GET['vid_id']."\""