Neden) çalışmaz (mysql_real_escape_string değil mi?

6 Cevap php

Ben PHP kullanarak veritabanına Someting yazmaya çalışıyorum ama mysql_real_escape_string kullanmaya çalışırsanız () herhangi bir hata alamadım ama hiçbir şey veritabanına kaydedilir alır ve ben aynı yaptım çünkü ben neden = / özel bilmiyorum başka bir PHP dosyasına ve o amele mükemmel ...

<?php
if(isset($_POST['reporte']))
    $falla = $_POST['reporte'];
else      
    $falla = "";

if(!isset($falla)){
    echo '<font color="red">Intentó enviar una forma vacía. Por favor intente de nuevo.</font>';
}else{
$fecha = mysql_real_escape_string(stripslashes($_POST['fecha']));
$usuario = mysql_real_escape_string(stripslashes($_POST['usuario']));

connection...

 $sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0')" or die('mysql_error()');

onlar şeklinde bir gizli alan yoluyla gönderilir beri "fecha" veya "usuario" boş olup olmadığını şimdi ben kontrol yok.


Edit

Orada hiçbir hata hala ve hiçbir şey = / Ben belgelerine bakıyorum db içine alır, ama aynı şekilde daha önce yaptık ve haha ​​... çalıştı çünkü şaşırıyorum anahtarı yaptım ...


Edit 2

Evet, bir var

mysql_query($sql) or die('Error SQL !'.$sql.'<br>'.mysql_error());

Evet ben bağlantısı ile birlikte $ tbl_name kurdum:

$host="localhost"; 
$username="user"; 
$password="pass"; 
$db_name="cosa"; 
$tbl_name="reportes";

ve ben Tamam döner ... veritabanı monitör kontrol yapılabilir ve basılı ettik ... Ancak, $ falla "hijyen" ile ne demek istiyorsunuz? Ben enjeksiyon tanımak, ama ben php başına oldukça yeniyim.


Edit 3

Ancak hiçbir hata ben "mysql_real_escape_string ()" kullanırsanız, sadece bir şey eklemek değil sorunsuz çalışır görüntülenen alan yoktur, sadece test etmek için ölmek kullanın


Edit 4

Bu benim geçerli kod:

<?php
if(isset($_POST['reporte']))
    $falla = $_POST['reporte'];
else      
    $falla = "";

if(!isset($falla)){
    echo '<font color="red">Intentó enviar una forma vacía. Por favor intente de nuevo.</font>';
}else{

    $host="localhost"; // Host name
    $username="user"; // Mysql username
    $password="pass"; // Mysql password
    $db_name="cosa"; // Database name
    $tbl_name="reportes"; // Table name

    // To protect MySQL injection
    $fecha = mysql_real_escape_string(stripslashes($_POST['fecha']));
    $usuario = mysql_real_escape_string(stripslashes($_POST['usuario']));
    $falla = mysql_real_escape_string(stripslashes($falla));

    $db = mysql_connect($host, $username, $password) or die('Cannot Connect '.mysql_error()); 
     mysql_select_db($db_name) or die('Cannot select DB '.mysql_error());

    $sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0')" or die('mysql_error()');

    mysql_query($sql) or die('Error SQL !'.$sql.'<br>'.mysql_error());

    header("location:../../user/usuario.php"); 
    mysql_close();    
}  
?>

İşte tam biri ve aynı zamanda ben hala DB içine bir şey almıyor ... burada alıyorum oldum önerilere göre değişti ...

6 Cevap

Sana mysql_real_escape_string kullanmadan önce mysql bağlantı açmak gerekebilir düşünüyorum. Belgelerine bakın.

EDIT

Bu deneyin, ama masada datatypes nelerdir? Tüm alanlar (usuario, comentario, fecha, Estado) dizeleri? Bu sizin insert deyimi ben inanıyorum, ne dediğini bulunuyor.

<?php
if( isset( $_POST[ 'reporte' ] ) ) {
    $falla = $_POST[ 'reporte' ];
} else {
    $falla = "";
}

if( !isset( $falla ) ) {
    echo '<font color="red">Intentó enviar una forma vacía. Por favor intente de nuevo.</font>';
} else {

    $host = "localhost"; // Host name
    $username = "user"; // Mysql username
    $password = "pass"; // Mysql password
    $db_name = "cosa"; // Database name
    $tbl_name = "reportes"; // Table name


    $db = mysql_connect( $host, $username, $password ) or die( 'Cannot connect ' . mysql_errno( ) );
    mysql_select_db( $db_name ) or die( 'Cannot select DB ' . mysql_error( ) );

    $fecha = mysql_real_escape_string( stripslashes( $_POST[ 'fecha' ] ) );
    $usuario = mysql_real_escape_string( stripslashes( $_POST[ 'usuario' ] ) );
    $falla = mysql_real_escape_string( stripslashes( $falla ) );

    $sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0')" or die( 'mysql_error()' );

    mysql_query( $sql ) or die( 'Error SQL !' . $sql . '<br>' . mysql_error( ) );

    // You need a URL here, not a relative path
    header( "Location:../../user/usuario.php" );
    mysql_close( );
}
?>

mysql_error çıkışını kontrol

Mysql uzantısı için genel kullanım-deseni:

mysql_query($sql) or trigger_error(mysql_error());

Sen $ sql var sonunda kontrol hata gerekmez:

$sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0')" or die( 'mysql_error()' );

Bu nedenle can veya güzünde ölmek şey yok, bir ifadedir. Aşağıdaki onu değiştirmeyi deneyin:

$sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0');"

Lütfen hata onun mutlaka nedeni ise emin değil, ama hiçbir az gerekli değildir.

Eğer mysql_real_escape_string kullanmadan önce mysql sunucusuna bağlanmak için gereken nickohrn tarafından belirtildiği gibi Ayrıca ben kodunuzu eksi başlık yönlendirme koştu. Kodu kayıt veritabanına olarak yerel, iyi çalıştı.

Header () çağrısı olmadan kod çalıştırmayı deneyin.

Bu başka bir yol deneyin. Hazırlanmış deyimleri yerine bu kaçan hackery kullanmak için DB veya benzeri çerçeve: PEAR kullanın. Mysql_real_escape_string ve stripslashes gibi arama fonksiyonları size veri çok fazla veya çok az eğik çizgi ile sona garip hatalar ve SQL enjeksiyon sorunları tanıtmak için mükemmel bir yoldur.

Her şeyden önce, ben bir mysql_query($sql) altında olduğunu varsayarak yaşıyorum: sizin örneğin son satırı asla die(), sadece orada bir dize oluştururken konum olarak.

İkinci olarak, ayarladığınız $tbl_name?

Üçüncü olarak, $sql, kontrol yazdırmak ve doğru görünüyorsa, veritabanı monitör ya da her türlü GUI aracı kullanmak bunu denemek için çalışın; veri aslında veritabanında biter if (sadece eklenen verileri SEÇ sonra, INSERT deneyin) bkz.

btw gerçekten sterilize $falla Eğer $fecha ayıklanmış ve $usuario oldum gibi olmalı - mysql_real_escape_string(stripslashes($falla)); ya da benzer bir şey. Aksi takdirde, $_POST['reporte'] (ve $falla) SQL injection için bir vektör haline gelir.

Bu MySQLi yıllara aşağı ve PDO'su () yöntemi hazırlamak için.