تعمل PDO bindValue مع المدخلات الأخرى، لماذا لا تعمل هذه؟

StackOverflow https://stackoverflow.com//questions/25069178

سؤال

أقوم بإنشاء نموذج حيث يمكن للمستخدمين تحديث سمات الكتب.يوجد نموذج HTML تم إنشاؤه ديناميكيًا حيث يمكن للمستخدمين إدخال قيم جديدة لأشياء مثل "العنوان" و"المؤلف" و"الوصف" والتي تبدو كما يلي:

echo "<form id=changerform name=changerform action=updatesubmit.php method=post>";
echo "<span id=titlebox>Title: <input class=attributefield style='border:none' type=text size=100 id=Title value='".$item['Title']."' />Change This?</span> <br>";
echo "<span id=authorbox>Author: <input class=attributefield style='border:none' type=text id=Author value='".$item['Author']."' />Change This?</span><br>";
echo "<span id=description>Description: <textarea class=attributefield style='border:none' rows=9 cols=100 name=Description id=Description >".$item['Description']."</textarea></span>";
echo "<input type='hidden' id='bookidfield' name='bookidfield' value = '".$toChange."' />";

يتم التعامل مع هذا النموذج بواسطة بعض لغة php التي تبدو كما يلي:

        while($nowfield = current($_POST)){

    $col = key($_POST);

    switch($col){
        case 'Title':
        $qstring = 'UPDATE Mainbooks SET Title = :slug WHERE ItemID LIKE :bookid;';
        break;

        case 'Author':
        $qstring = 'UPDATE Mainbooks SET Author = :slug WHERE ItemID LIKE :bookid;';
        break;

        case 'Description':
        $qstring = "UPDATE Mainbooks SET Description = :slug WHERE ItemID LIKE :bookid;";
        break;

        default:
        echo "Invalid input";
        break;

        }//end switch

    $upquery = $safelink->prepare($qstring);
    $upquery->bindValue(':slug', $nowfield, PDO::PARAM_STR);
    $upquery->bindValue(':bookid', $_POST['bookidfield'], PDO::PARAM_INT);
    $upquery->execute();

next($_POST);





} //end while

لقد قمت بتنظيمها كبيان تبديل لأن هناك رمزًا في النموذج يمرر فقط الحقول التي تم تغييرها خلال النشر (باستثناء إدخال "bookidfield"، الذي يحتوي على المفتاح الفريد لكل عنصر فيه.) التبديل، يتم تشغيل الاستعلامات الضرورية فقط.

يعمل حقلا "العنوان" و"المؤلف" بشكل جيد؛يقومون بالتحديث دون مشكلة إلى القيم الجديدة.حقل "الوصف" ، على الرغم من ذلك ، يتم تحديثه دائمًا إلى قيمة "Bookidfield". يمكنني إصلاحه إذا دخلت وتغيير المعلمة ": bookid" يدويًا إلى معرف الكتاب الذي أريده.

اذا انا var_dump(_$POST) يبدو أنه يأتي مع القيم الأساسية الصحيحة، مثل ذلك:

    array(4) { ["Title"]=> string(22) "Gross Boogers and Such" ["Author"]=> string(14) "Franny Panties" ["Description"]=> string(55) "This is the value I want to change the description to!!" ["bookidfield"]=> string(3) "184" }

لكن في طاولة SQL الخاصة بي ، سيغير عنوان الكتاب 184 إلى "Gross Boogers ومثل هذا" والمؤلف إلى "سراويل فرانس" ، لكنه سيغير الوصف إلى "184." يجب أن يكون له علاقة باستخدام BindValue () ، أليس كذلك؟أم أن الأمر له علاقة بحلقتي؟هل هكذا يتم تسمية النموذج؟لقد كنت أنظر إليه لفترة طويلة جدًا لأرى ما هو عليه.

شكرًا Stackoverflow، أنتم رائعون يا رفاق.

هل كانت مفيدة؟

المحلول

مشكلتك هي أنه عندما يكون $col مختلفًا عن العنوان أو المؤلف أو الوصف، بمعنى آخر، عندما ينفذ المحول الحالة الافتراضية، فإنك تنفذ الاستعلام السابق باستخدام $nowfield = 184.يجب عدم تنفيذ الاستعلام.

عند تنفيذ التبديل لحالة الأحرف الافتراضية، يجب عليك "الانتقال" إلى القيمة التالية، وتخطي تنفيذ الاستعلام.

default:
    echo "Invalid input";
    next($_POST);
    continue 2;
    break;

نصائح أخرى

HTML الخاص بك معطل لـ وصف <textarea>.لديك...

<textarea ... name=Description id=Description />".$item['Description']."</textarea>
<!--                                          ^ there's your problem -->

حيث ينبغي أن يكون

<textarea ... name=Description id=Description>".$item['Description']."</textarea>

كما هو مذكور في تعليقي، فإن الطريقة التي تنشئ بها HTML لا بد أن تؤدي إلى مشاكل.أقترح عليك اتباع هذا النهج..

// leave the PHP context
?>
<form id="changerform" action="updatesubmit.php" method="post">
    <span id="titlebox">
        Title:
        <input class="attributefield" type="text" id="Title" value="<?= htmlspecialchars($item['Title']) ?>">
        Change This?
    </span>
    <!-- you get the idea -->
</form>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top