javascript fonksiyonu yankı php sözdizimi

5 Cevap php

I hope somebody can help me with this little problem. The problem is that I still get confused with the syntax

Php hat yankı bir parametre, veritabanı değeri alır bir javascript fonksiyonu bulunuyor.

It needs to be corrected, to get it to work. extra comma's??escaping?? I never know where exactly.

while($row=mysql_fetch_array($r)){
     echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';

}

EDIT BECAUSE I just found out that my syntax is correct. I just needed to include the backslashes. It seems the javascript function is causing problems. In particular the line that hides the list

Does anyone has a solution for this?

function fill(thisValue) {
    $('#inputString').val(thisValue);
   //$('#suggesties').hide();

}

EDIT I finally came up with this: a callback

function fill(thisValue) {

     $('#suggesties').fadeOut('fast',function(){
        $('#inputString').val(thisValue);
    });

    }

teşekkürler, Richard

5 Cevap

echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';

Ahh. Değişmez bir PHP dize içinde, bir HTML kodlanmış niteliği içinde, bir JavaScript dize literal var. Öncelemeli aklını karıştırıyor şaşmamalı.

Peki, ilk: Eğer $row['value'] kaçan olmadan liste öğenin metninde çıktılıyorsanız. Bu değer <, & ve " gibi özel karakterler içeriyorsa, bu sorun (potansiyel güvenlik sorun) demektir. Bu htmlspecialchars() sarılmış edilmesi gerekmektedir.

Sonra, değişmez bir JavaScript dize şey koyuyorlar. Yine, potansiyel: Bu dize sınırlayıcı karakter ' veya kaçan ters eğik çizgi \ değeri kullanılırsa, bu dize patlak ve sayfanın içine JavaScript kodu enjekte demektir güvenlik sorunu. addslashes() değişmez bir JS dize eklenmek üzere bir dize kaçmak için kullanılabilir; Hala htmlspecialchars() sonradan dize literal bir HTML kodlanmış niteliği kendisi iç çünkü var unutmayın.

Yani biz bakıyoruz:

echo "<li onclick=\"fill('".htmlspecialchars(addslashes($row['value']), ENT_QUOTES)."');\">".htmlspecialchars($row['value']).'</li>';

Çok okunabilir değil, değil mi? Peki, biz bu artırabilirsiniz:

  1. Biz (Jonathan tarafından gösterildiği gibi) dizeleri sokmak için PHP'nin kendisi kullanarak literal PHP dize kaybedebilir. PHP çiftleşmiş dili, bundan yararlanmak!

  2. Biz tipik bir şablonda bu fonksiyonunu çok kullanmak gerekir çünkü iyi bir fikir olduğunu, htmlspecialchars daha kısa bir isimde bir fonksiyon tanımlayabilirsiniz.

  3. Biz JavaScript tarafı liste öğesinin içeriğinden ihtiyacı veri okumak suretiyle JavaScript dize literal önleyebilirsiniz (text(), jQuery, size kullanıyor görünüyor ne yana), yerine zorunda göre çirkin bir satır içi olay işleyicisi içinde sarın.

Örneğin:

<?php
    function h($text) {
        echo(htmlspecialchars($text, ENT_QUOTES));
    }
?>

<ul id="suggesties">
    <?php while ($row= mysql_fetch_array($r)) { ?>
        <li><?php h($row['value']); ?></li>
    <?php } ?>
</ul>

<script type="text/javascript">
    $('#suggesties>li').click(function() {
        $('#inputString').val($(this).text());
        $('#suggesties').hide();
    });
</script>

Ben de javascript kullanılmak üzere dize kaçış tavsiye ederim. json_encode hile yok. Ve html kısmı da, if it's not supposed to contain html:

echo '<li onclick="fill('.htmlentities(json_encode($row["value"])).');">'.htmlspecialchars($row["value"]).'</li>';

PHP Etiketler içinde PHP tutmak olabilir. Bazen çeşitli yerlerde kaçan daha kolay:

<?php while($row=mysql_fetch_array($r)) { ?>
  <li onclick="fill('<?php print $row["value"]; ?>');">
    <?php print $row["value"]; ?>
  </li>
<?php } ?>

Böyle kaçan deneyin:

while($row=mysql_fetch_array($r)){
 echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';

}

Eğer $row[value] yerine var ki değeri etrafında tırnak kaldırın $row["value"].