Tırnak Surround dize

4 Cevap php

Bir dize tırnak ekler PHP bir işlevi var mı?

gibi "'".str."'"

Bu VARCHARS ile bir sql sorgu için. Ben sonuç olmadan, biraz aradı ...

Ben aşağıdakileri yapın:

$id = "NULL";
$company_name = $_POST['company_name'];         
$country = $_POST['country'];
$chat_language = $_POST['chat_language'];
$contact_firstname = $_POST['contact_firstname'];
$contact_lastname = $_POST['contact_lastname'];
$email = $_POST['email'];
$tel_fix = $_POST['tel_fix'];
$tel_mob = $_POST['tel_mob'];       
$address = $_POST['address'];       
$rating = $_POST['rating'];

$company_name = "'".mysql_real_escape_string(stripslashes($company_name))."'";
$country = "'".mysql_real_escape_string(stripslashes($country))."'";
$chat_language = "'".mysql_real_escape_string(stripslashes($chat_language))."'";
$contact_firstname = "'".mysql_real_escape_string(stripslashes($contact_firstname))."'";
$contact_lastname = "'".mysql_real_escape_string(stripslashes($contact_lastname))."'";
$email = "'".mysql_real_escape_string(stripslashes($email))."'";
$tel_fix = "'".mysql_real_escape_string(stripslashes($tel_fix))."'";
$tel_mob = "'".mysql_real_escape_string(stripslashes($tel_mob))."'";
$address = "'".mysql_real_escape_string(stripslashes($address))."'";
$rating = mysql_real_escape_string(stripslashes($rating));

$array = array($id, $company_name, $country, $chat_language, $contact_firstname, 
$contact_lastname, $email, $tel_fix, $tel_mob, $address, $rating);
$values = implode(", ", $array);

$query = "insert into COMPANIES values(".$values.");";

4 Cevap

Öncelikle, kullandığınız görüyorum stripslashes(). Yani magic quotes üzerinde ima ediyor. Ben kapatarak öneririm.

Yapmak istediğiniz ne olabilir bir fonksiyonu bu bazı alınır:

function post($name, $string = true) {
  $ret = mysql_real_escape_string(stripslashes($_POST[$name]));
  return $string ? "'' . $ret . "'" : $ret;
}

ve daha sonra:

$company_name = post('company_name');

Bütün bu ancak biraz sahip Demirbaş miktarını azaltmak olduğunu gelmez.

Bazıları sadece bu yüzden hazır deyimleri kullanabilirsiniz için PDO veya mysqli kullanarak sürmüştür. Onlar yararlı olabilir iken kesinlikle not gereklidir. SQL enjeksiyon (en azından bu kodun durumunda) için güvenlik açığı iddiaları sapıklık böylece alanları kaçıyorlar.

Son olarak, ben bir sorgu bu şekilde inşa etmem. Bir şey için belli bir tür ve düzenin şirketlerin tablo varlık sütun dayanarak oluyor. Bu konuda açık olmak çok daha iyidir. Ben genelde bu işi:

$name = mysql_real_escape_string($_POST['name']);
// etc
$sql = <<<END
INSERT INTO companies
(name, country, chat_language)
VALUES
($name, $country, $language)
END;

Görev için yeterli olduğunu irade. Siz tabii mysqli veya PDO kullanarak araştırabilirsiniz ama gerekli de değil.

Aksine sorgu doğrudan değerini ekleyerek daha, prepared statements ve SQL injection karşı savunmasız değildir parametreleri kullanın.

$query = $db->prepare('SELECT name,location FROM events WHERE date >= ?');
$query->execute(array($startDate));

$insertContact = $db->prepare('INSERT INTO companies (company_name, country, ...) VALUES (?, ?, ...)');
$insertContact->execute(array('SMERSH', 'USSR', ...));

: (Ayrıca DB bağlanır ve böylece mysql_connect bir karşılığıdır) basit bir PDO nesnesi oluşturma

$db = new PDO('mysql:host=localhost;dbname=db', 'user', 'passwd');

Eğer bir DB bağlantısı istediğiniz her komut dosyası bu dağılım olmamalıdır. Bir kere, bu bir güvenlik riski daha fazla bulunuyor. Başka için, kod yazım hataları daha duyarlı olacaktır. Çözüm hem sorunları giderir: DB bağlantı kurar bir işlev veya yöntem oluşturun. Örneğin:

function localDBconnect($dbName='...') {
    static $db = array();
    if (is_null($db[$dbName])) {
        $db[$dbName] = new PDO("mysql:host=localhost;dbname=$dbName", 'user', 'passwd');
        $db[$dbName]->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    return $db[$dbName];
}

Fazla iki ya da üç unsurdan bir dizi ile çalışıyorsanız örnek kod yapılır gibi, sen yerine benzer tabloların uzun bir dizisi daha döngüler veya dizi işlevleri kullanmanız gerekir. Örneğin, numune çoğu ile ikame edilmiş olabilir:

$array = array();
foreach ($_POST as $key => $val) {
    $array[$key] = "'" . mysql_real_escape_string(stripslashes($val)) . "'";
}

Burada bir ekleme sorgusu oluşturarak daha kapsamlı bir örnek. O kadar üretime hazır hale gelen, ama temellerini göstermektedir.

$db = localDBconnect();

// map input fields to table fields
$fields = array(
  'company' => 'company_name',
  'country' => 'country',
  'lang' => 'chat_language',
  'fname' => 'contact_firstname',
  'lname' => 'contact_lastname',
  'email' => 'email',
  'land' => 'tel_fix',
  'mobile' => 'tel_mob',
  'addr' => 'address',
  'rating' => 'rating',
);
if ($missing = array_diff_key($fields, $_POST)) {
    // Form is missing some fields, or request doesn't come from the form.
    ...
} else {
    $registration = array_intersect_key($_POST, $fields);

    $stmt = 'INSERT INTO `dbname`.`Companies` (`' 
        . implode('`, `', $fields) . '`) VALUES (' 
        . implode(', ', array_fill(0, count($registration), '?')) . ')';
    try {
        $query = $db->prepare($stmt);
        $query->execute(array_values($registration));
    } catch (PDOException $exc) {
        // log an 
        error_log($exc);
        echo "An error occurred. It's been logged, and we'll look into it.";
    }
}

Bu üretim hazır hale getirmek için, kod işlevleri veya kodun geri kalanından ilgili her şeyi veritabanını gizlemek sınıfa refactored olmalıdır; bu bir "data access layer" olarak adlandırılır. Kullanımı $fields keyfi tablo yapıları için çalışacak kod yazma bir yol gösterir. Daha fazla bilgi için "Model-View-Controller" mimarileri bak. Aynı zamanda, doğrulama yapılmalıdır.

Kendi oluşturun.

function addQuotes($str){
    return "'$str'";
}

Bunu yapmayın. Bunun yerine bu tür PDO olanlar gibi parametrized sorguları kullanın.