MySQL veritabanı ile sorun, değerleri takılı değil

7 Cevap php

Ben veritabanında değerleri eklemek çalışıyorum ve değerler eklenir olmak değil, burada ben var kodu:

    $user_name = "username";
    $password = "password";
    $database = "database";
    $server = "localhost";
    $db_handle = mysql_connect($server, $user_name, $password);
    $db_found = mysql_select_db($database, $db_handle);

    if ($db_found) {

    $SQL = 'INSERT INTO table (anInt, DomainName, URL, Rank, PageRank, Google, Bing, Boss, IndexedPage, Backlinks) VALUES ($anInt, $Domain, $URL, $Rank, $Pagerank, $Google, $Bing, $Yahoo, $Pages, $backlinks)';
    $result = mysql_query($SQL);
    mysql_close($db_handle);

    print "Records added to the database";

kayıtların veritabanına eklenen yazdırıyor ancak veritabanı şey bakarken ilave ediliyor. değerlerin bazı çiftler, metin ve ints vardır. Bu hata ayıklamak için yine de var mı? Birisi bana sorarsa ben mesaja daha fazla bilgi ekleyerek olacaktır.

ve tabii ki ben sadece kayıt eklendiğinde bana anlatıyor beri alakalı değil düşünce bir başka deyimi var.

7 Cevap

Her şeyden önce, size mysql_real_escape_string kullanarak, SQL sorgu içine geçiyoruz dize değerlerini kaçmak gerekir.

Sonra dizeler içeren içindir alanlara civarı, SQL sorgusunda, tırnak eklemek gerekir.


I don't really know which fields are integers and which fields are strings, but you should be using something like this to build your SQL query :

// Escape the string data, and make sure integer really contain integers
$anInt = intval($anInt);
$Domain = mysql_real_escape_string($Domain);
$URL = mysql_real_escape_string($URL);
$Rank = intval($Rank);
$Pagerank =  = intval($Pagerank);
$Google = intval($Google);
$Bing = intval($Bing);
$Yahoo = intval($Yahoo);
$Pages = intval($Pages);
$backlinks = intval($backlinks );

// Build the SQL query, using the "safe" variables
$SQL = 'INSERT INTO table (anInt, DomainName, URL, Rank, PageRank, Google, Bing, Boss, IndexedPage, Backlinks) 
        VALUES ($anInt, '$Domain', '$URL', $Rank, $Pagerank, $Google, $Bing, $Yahoo, $Pages, $backlinks)';

Eğer mysql_real_escape_string kullanmak ve de diğer bazı alanlar için değerleri etrafında tırnak eklemek zorunda kalabilirsiniz - bu sadece DomainName ve URL dizelerini içeren içindir ki supposing , gerekirse.


Then, you should take a look at the return value of
mysql_query : for an insert query, in case of an error, it'll return false.

Burada, $result değişken false, sen mysql_error and mysql_errno kullanmalısınız ise: onlar biliyor izin verirsiniz ne hata oldu - bu örneğin, SQL sorgusu hataları tespit yardımcı olacaktır.


If this doesn't solve the problem, you should try outputting the SQL query, and run it using something like phpMyAdmin, to make sure it's OK.

Ben PHP uzman değilim, ama ben 2 açıklamalar var.

  1. (Belki de mysql_errno ile ()) hata kontrol kalmamak kayıtları eklendi mi bilmiyorum

  2. Ben değerler, onlar dizeleri eğer, gibi verilmesi gerektiğini düşünüyorum

    '$ Domain'

yani, karakterler 'ile kaçtı.

daha iyi gibi bir şey kullanarak, tabii, olacak

$sql = sprintf("INSERT ... VALUES(%d, '%s', '%s',...)", 
               $anInt, mysql_real_escape_string($Domain), ...);

Eğer kullanıcı girdileri ile eklerseniz.

Sen $ sonucu incelemek olabilir:

$result = mysql_query($query);
if (!$result) {
    print "An error occured: " . mysql_error() . "\n";
}

Benim tahminim gibi, tırnak işaretleri olmadan bir dize geçiyoruz ki:

VALUES (Hello)

nerede gibi geçmelidir:

VALUES ('Hello')

Yorumcu Dediğim gibi kullanıcı bu dizeleri kontrol edebilirsiniz eğer, bir SQL Injection saldırısı açıktır. Örneğin, dizeleri kaçan bu saldırıyı önleyebilir:

$query = sprintf("INSERT INTO table (DomainName) VALUES ('%s')",
        mysql_real_escape_string($domain_name));

SQL sorguları, doğru dizeleri enquote gerekir, yoksa bir hata üretecektir. Yani veritabanında olmayan int veya non-boolean değerleri saklamak için kullanılan tüm değişkenleri değerler etrafında tırnak gerekir.

Ayrıca SQL enjeksiyonu all values mysql_real_escape_string ile ilk kaçan bir sorun olmadığından emin olun.

Apart sql enjeksiyonları hata işleme tam değildir ...

if (!$db_found) {
  echo "datbase not found.";
}
else {
  $SQL = 'INSERT INTO
      table
      (...)
    VALUES
      (...)
  ';
  $result = mysql_query($SQL, $db_handle);
  if ( !$result ) {
    echo "error: ", mysql_error($db_handle);
  }
  else {
    print "Records added to the database";
  }
}
mysql_close($db_handle);

Durumda bir sorgu, bir hata mysql_query () YANLIŞ ve mysql_error() size hata hakkında daha fazla anlatacağım dönmek olur.

Peki orada kodu ile güvenlik sorunları vardır ama bir sorunu çözmek için

Eğer SQL deyiminde tırnak içinde dize değerlerini kuşatan değildir.

Her şeyden önce, güvenli veritabanı kullanım ve enjeksiyon kaçınarak herkesin başkasının tavsiyesi kabul edin.

Sorgu şey yapmıyor nedeni tek tırnak dize kapalı muhtemelen. PHP tek tırnak dize literal olmaya zorlamak. Çift tırnak kullanırken aksine, değişkenler ikame edilmeyecektir. Bu yüzden '$foo' karakter dizisini temsil eder '$'.'f'.'o'.'o'. "$foo" Diğer taraftan, değişken $foo dizesi'nın tanımının zamanında içeren her türlü karakter dizisini temsil eder.

Sen mysql_error() MySQL ile en sorunları yakalamak için kullanabilirsiniz. Mesajı size yardımcı olmasa bile, en azından sorun yatıyor yani hangi bağlantı ucu üzerine, sorgu düzgün ayrıştırılır olmadığını biliyorum.