Metinde sprintf ve% işaretler

5 Cevap php

Geçenlerde rastladım Bir sorun bu kodu kullanarak benim veritabanındaki bir alanı güncelleştirmek için çalışırken işe yaramaz oldu. Ama iyi çalıştı sprintf ile takılması ... (O $ not, $ note_escaped) güncellenen metin içinde bir% işareti olan geri takip.

Ben güncellemeleri için sprintf kullanarak olmamalıdır, ya da farklı kurulsun?

Bazı arama yaptım ama bir şey gelmedi.

$id = mysql_real_escape_string($id);
$note_escaped = mysql_real_escape_string($note);
$editedby = mysql_real_escape_string($author);
$editdate = mysql_real_escape_string($date);
//insert info from form into database
$query= sprintf("UPDATE notes_$suffix SET note='$note_escaped', editedby='$editedby', editdate='$editdate' WHERE id='$id' LIMIT 1");

Çok teşekkürler!

5 Cevap

Sen tamamen yanlış sprintf'i kullanıyorsunuz. Kodunuzu işlev çağrısı Çıkarma hala aynı şeyi yapardı. Bu olmalıdır:

sprintf("UPDATE notes_%s SET note='%s', editedby='%s', editdate='%s' WHERE id=%d LIMIT 1", $suffix, $note_escaped, $editedby, $editdate, $id);

Sen kılavuzunu okumalısınız.

Eğer prepared statements yerine sprintf-çağrı kullanıyor olmalıdır her şeyden önce

kesinlikle bu şekilde yapmak zorunda ama eğer kullanmak zorunda:

$id = mysql_real_escape_string($id);
$note_escaped = mysql_real_escape_string($note);
$editedby = mysql_real_escape_string($author);
$editdate = mysql_real_escape_string($date);
//insert info from form into database
$query= sprintf("
  UPDATE notes_%s /* this is still open for injection, and cannot be properly escaped with mysql_real_escape_string */
  SET note='%s', 
  editedby='%s', 
  editdate='%s' 
  WHERE id='%d'
  LIMIT 1",
$suffix,
$note_escaped, $editedby, $editdate, $id);

Siz mysql \% ile değiştirerek kaynak metinde % kaçabilir.

Eğer bir şekilde verileri biçimlendirmek için gerekli olmadıkça sprintf (), PHP pek kullanılmaz. Bu iki ifadeler PHP aynı şekilde çalışıyor:

$num = 42;
$char = 'q';

$text = sprintf('The number is %d and the character is %s', $num, $char);
$text = "The number is $num and the character is $char";

sprintf adlı bir dizeye "baskı" değişken veri için C daha fazla kullanılmaktadır. Ama PHP zaten çift tırnakla, böylece sprintf'i özel biçimlendirme işlevlerini (örneğin, %0.2f 2-ondalık-yer şamandıra için), bu düzenli dize yöntemi kullanmak daha kolay kullanmanız gerekir sürece bunu yapabilirsiniz.

Dan http://php.net/manual/en/function.mysql-real-escape-string.php:

Note: mysql_real_escape_string() does not escape % and _. These are wildcards in MySQL if combined with LIKE, GRANT, or REVOKE.

Elle% kaçmak gerekir ve _ \% ile herhangi bir ve _ eğer. Ben sprintf'i kullanmanızı öneririz, ama sadece kaçış fonksiyonunu geliştirmek yok.