html formu ile düzenleme mysql tablo

4 Cevap php

Amacım bu yüzden müşteri giriş ve bir html formu aracılığıyla MySQL tablo verileri düzenlemek CMS tabanlı basit bir form sahip olmaktır. Oturum çalışıyor, ancak düzenleme sayfasında MySQL tablosundan değerleri dönen değil, ne de herhangi bir hata alıyorum.

Ben hâlâ amatör değilim ve ben ilk bir sınıf projesi için aşağıdaki kodu başladı, ama şimdi canlı site için bunu uygulamak planlıyoruz. Kimden ne anlıyorum ben bir sonraki / önceki / etc bildirmek zorunda olmamalıdır. Zaten bunu yapmak için çabaladılar üstünde değişkenler. Şey size herhangi öne mu?:

<?php

echo "<h2>Edit Special Offer</h2><hr>";

if (isset($_COOKIE["username"]))
    {
    echo "Welcome " . $_COOKIE["username"] . "!<br />";
    include "login.php";
    }
else
  echo "You need to log in to access this page.<br />";


if(isset($previous))
{
$query = "SELECT id, specialtitle, specialinfo
FROM special WHERE id < $id ORDER BY id DESC";
$result = mysql_query($query);
check_mysql();
$row = mysql_fetch_row($result);
check_mysql();
if ($row[0] > 0)
{
$id = $row[0];
$specialtitle = $row[1];
$specialinfo = $row[2];
}
}


elseif (isset($next))
{
$query = "SELECT id, specialtitle, specialinfo
FROM special WHERE id > $id ORDER BY id ASC";
$result = mysql_query($query);
check_mysql();
$row = mysql_fetch_row($result);
check_mysql();
if ($row[0] > 0)
{
$id = $row[0];
$specialtitle = $row[1];
$specialinfo = $row[2];
}
}



elseif (isset($add))
{
$query = "INSERT INTO special (specialtitle, specialinfo)
VALUES ('$specialtitle', '$specialinfo')";
$result = mysql_query($query);
check_mysql();
$id = mysql_insert_id();
$message = "Special Offer Added";
}


elseif (isset($update))
{
$query = "UPDATE special
SET specialtitle='$specialtitle', specialinfo='$specialinfo'
WHERE id = $id";
$result = mysql_query($query);
check_mysql();
$id = mysql_insert_id();
$message = "Monthly Special Updated";
}


elseif (isset($delete))
{
$query = "DELETE FROM special WHERE id = $id";
$result = mysql_query($query);
check_mysql();
$specialtitle = "";
$specialinfo = "";
$message = "Special Offer Deleted";
}
$specialtitle = trim($specialtitle);
$specialinfo = trim($specialinfo);
?>



<form method="post" action="editspecial.php">
<p><b>Special Offer</b>
<br><input type="text" name="specialtitle" <?php echo "VALUE=\"$specialtitle\"" ?>> </p>

<p><b>Special Info/Description</b>
<br><textarea name="specialinfo" rows="8" cols="70" >
<?php echo $specialinfo ?>
</textarea> </p>

<br>
<input type="submit" name="previous" value="previous">
<input type="submit" name="next" value="next">
<br><br>
<input type="submit" name="add" value="Add">
<input type="submit" name="update" value="Update">
<input type="submit" name="delete" value="Delete">
<input type="hidden" name="id" <?php echo "VALUE=\"$id\"" ?>>
</form>
<?php
if (isset($message))
{
echo "<br>$message";
}
?>

Login.php:

<?php

function check_mysql()
{
if(mysql_errno()>0)
{
die ("<br>" . mysql_errno().": ".mysql_error()."<br>");
}
}
$dbh=mysql_connect ("xxxxxxxxxxxxxxxxx","xxxxxxxx","xxxxxxxx");
if (!$dbh)
{
die ("Failed to open the Database");
}
mysql_select_db("xxxxxx");
check_mysql();
if(!isset($id))
{
$id=0;
}

?>

4 Cevap

Please please please do a little bit more learning before attempting to build this thing. You can do it the way you are doing it, but with just a small amount of extra knowledge about OO programming, and maybe about the Pear db classes you will have 3x cleaner code.

Eğer gerçekten, en azından, senin Kaydet, güncelleştirmenin her çekin silmek yerine, sadece kod onları inlining fonksiyonları içine vb prosedürler seçerseniz. ayrı bir dosyaya koyun ve bu sayfa içinde yer alıyor.

Bu sizin için yararlı olmayabilir, ama ben burada sizin için sayfada bir genel tablo erişim sınıfını dökümü için gidiyorum. Bu basit bir db sınıfı API'sini gerektirir, ama bu ve bunun benzeri ya da bir şey kullanırsanız hayatınızı kolaylaştıracak 5x olacaktır.

If you don't understand this code when you look at it, that's ok, but please just come back and ask questions about the stuff you don't understand. That is what stackoverflow is for. This is an older class that should just do basic stuff. Sorry it's not better I just wanted to dig something out of the archives for you that was simple.

<?php
// Subclass this class and implement the abstract functions to give access to your table
class ActiveRecordOrder
{

    function ActiveRecordOrder()
    {
    }

    //Abstract function should return the table column names excluding PK
    function getDataFields()
    {}

    //Abstract function should return the primary key column (usually an int)
    function getKeyField()
    {}

    //abstract funtion just return the table name from the DB table
    function getTableName() 
    {}

    /*
    This function takes an array of fieldName indexed values, and loads only the
    ones specified by the object as valid dataFields.
    */
    function loadRecordWithDataFields($dataRecord)
    {
        $dataFields = $this->getDataFields();
        $dataFields[] = $this->getKeyField();
        foreach($dataFields as $fieldName)
        {
            $this->$fieldName = $dataRecord[$fieldName];
        }
    }

    function getRecordsByKey($keyID, &$dbHandle)
    {
        $tableName = $this->getTableName();
        $keyField  = $this->getKeyField();
        $dataFields = $this->getDataFields();
        $dataFields[] = $this->getKeyField();

        $results = $dbHandle->select($tableName, $dataFields, array($keyField => $keyID));

        return $results;
    }

    function search($whereArray, &$dbHandle)
    {
        $tableName = $this->getTableName();
        $dataFields = $this->getDataFields();
        $dataFields[] = $this->getKeyField();
        return  $dbHandle->select($tableName, $dataFields, $whereArray);
    }

    /**
    * Since it is *hard* to serialize classes and make sure a class def shows up
    * on the other end. this function can just return the class data.
    */
    function getDataFieldsInArray()
    {
        $dataFields = $this->getDataFields();
        foreach($dataFields as $dataField)
        {
            $returnArray[$dataField] = $this->$dataField;
        }
        return $returnArray;
    }

    /**
    * Added update support to allow to update the status
    * 
    * @deprecated - use new function saveObject as of 8-10-2006 zak
    */
    function updateObject(&$dbHandle)
    {

        $tableName = $this->getTableName();
        $keyField = $this->getKeyField();
        $dataArray = $this->getDataFieldsInArray();

        $updatedRows = $dbHandle->updateRow(
            $tableName,
            $dataArray, 
            array( $keyField => $this->$keyField )
        );

        return $updatedRows;
    }   

    /**
    * Allows the object to be saved to the database, even if it didn't exist in the DB before.
    * 
    * @param mixed $dbhandle
    */
    function saveObject(&$dbhandle)
    {
        $tableName = $this->getTableName();
        $keyField = $this->getKeyField();
        $dataArray = $this->getDataFieldsInArray();

        $updatedRows = $dbHandle->updateOrInsert(
            $tableName,
            $dataArray, 
            array( $keyField => $this->$keyField )
        );

        return $updatedRows;
    }   
}
"Welcome " . $_COOKIE["username"] . "!<br />"; [and many other places]

Cross-site güvenlik delikleri açan HTML-enjeksiyon. Sen htmlspecialchars HTML bir metin değer çıkış her zaman kullanmak gerekir.

"INSERT INTO special (specialtitle, specialinfo) VALUES ('$specialtitle'  [and many other places]

Veritabanı vandalizm önde gelen SQL enjeksiyon. Sen değişmez bir SQL dize çıktı her seferinde bir metin değeri mysql_real_escape_string kullanmanız gerekir.

if (isset($_COOKIE["username"]))

Çerezler herkes istemci tarafında bir username çerez ayarlayabilirsiniz, güvenli değildir. Sadece kayıtlı veya oturumu kullanıcı kimliği için bir anahtar olarak, erişim kontrolü için kullanmayın.

Ayrıca doğrudan değişken olarak $ _REQUEST değerlerine erişmek için register_globals kullanarak görünür. Bu hayır-hayır başka aşırı olduğunu.

Tüm bu güvenlik snafus Arasında virüs ve spam itmek için sitenizde devralacak Rus hackerlar için oturan bir ördek vardır.

Orada kodu ile dikkatli olun. Sizin çerez değeri filtreleme değil ve kolayca ziyaretçi tarafından değiştirilebilir gibi orada doğrudan bir kullanıcı adı saklamak olmamalıdır. Sen çerez verilerini ve teslim ediliyor eany form verileri filtreleme için filter_input içine bakmak gerekir - özellikle $ _POST ['id']

Bu daha saldırılara karşı size satır aşağı gönül yarası çok kazandıracak.

Değişkenleri ayarlanır ama önceki, sonraki set Yüklü eğer else if ifadeleri kontrol ediyoruz, eklemek vb

Eğer kontrol etmek gerekir bu yüzden bu değerleri ile gönderme düğmeleri kullanarak

if(isset($_POST['previous']))

sizinki yerine hangi

if(isset($previous))

Eğer göndermeyen yerde dahil bir dosya yoksa, ya sizin veritabanı ayrıntıları ayarlamak nerede göremiyorum. (Tabii gerçek olanları sonrası yok ama bir şey göremiyorum)

Ben login.php ne oluyor bilmiyorum, ama ayarlanır önce $ kimliği kullanarak ediyoruz. Bu sadece ilk bölümünde bulunuyor.

Edit: Benim tahminim $ id boş ve hiçbir şey geri alır bu yüzden olacak, her bir sorgu ifadesinde $ id kullanarak ve daha sonra ayarlıyorsunuz, açıklığa kavuşturmak için.

Edit 2: başka ne login.php oluyor? Eğer $ _POST değişkenleri okumak hiç varsa, hiçbir şey olur.

Edit 3: Ben zaten kısmen bir açıklamada söylediğim gibi, sizin if(isset($previous)) bölümünde, elseif (isset($update)) bölümü ve elseif (isset($delete)) bölümleri $ id gibi bir şey yapmayacağım her zaman 0'dır.

Lütfen kullanıcı kimlik doğrulaması sonra and filter yayınlanmıştır değişkenleri, $ _POST ['id'], $ _POST ['önceki'], vb almak gerekir