Php 更新时未定义的变量

Php 更新时未定义的变量,php,Php,在这里,我的目标是用我在文本框中设置的标题更新一本书的信息。但是在我的代码中,当我运行时,我得到了错误,因为$query2在$query2['status']==“Available”中未定义。有人能纠正我的错误吗 <?php $user="root"; $server="localhost"; $password=""; $db="library book"; $query=mysql_connect($server,$user,$password); $dbRes = mysql_se

在这里,我的目标是用我在文本框中设置的标题更新一本书的信息。但是在我的代码中,当我运行时,我得到了错误,因为
$query2
$query2['status']==“Available”
中未定义。有人能纠正我的错误吗

<?php
$user="root";
$server="localhost";
$password="";
$db="library book";
$query=mysql_connect($server,$user,$password);
$dbRes = mysql_select_db($db,$query);

if(isset($_GET['book_id']))
{
    $bookid = $_GET['book_id'];
    $str="select * from books where bookid=$bookid";
$query1=mysql_query($str);
//echo $query1;
$query2=mysql_fetch_array($query1);
//print_r ($query2);
}
if(isset($_POST['Update']))
{
$title=mysql_real_escape_string($_POST['title']);
        $author=mysql_real_escape_string($_POST['author']);
        $publisher=mysql_real_escape_string($_POST['publisher']);
        $numcopies=mysql_real_escape_string($_POST['numcopies']);
        $shelfno=mysql_real_escape_string($_POST['shelfno']);
        $status=mysql_real_escape_string($_POST['status']);
        $str1="update books set title=$title where bookid=$bookid";
        $query3=mysql_query($str1);
        echo $query3;
        $query4=mysql_query("select * from books");
        $row=mysql_fetch_array($query3);
        echo "<table>";
        echo "<tr><th>BookID</th><th>Title</th><th>Author</th><th>Publisher</th><th>numcopies</th><th>shelfno</th><th>status</th><th>Action</th></tr>";

echo "<tr>";
echo "<td>".$row['bookid']."</td>";
echo "<td>".$row['title']."</td>";
echo "<td>".$row['author']."</td>";
echo "<td>".$row['publisher']."</td>";
echo "<td>".$row['numcopies']."</td>";
echo "<td>".$row['shelfno']."</td>";
echo "<td>".$row['status']."</td>";
echo "</tr>";
echo "</table>";
if ($query2['status']=="Available") 
echo "selected";
if ($query2['status']=="Unavailable") 
echo "selected";
}


?>



<html>
<head><title>Editing the fields</title>
<style>
body {
background-color: rgb(255,0,255);
}
</style>
</head>
<body>
<form action="edit1.php" action="post">

EnterTitle:<input type="text" name="title" value="<?php echo $query2['title'];?>">
<br/>
EnterAuthor:<input type="text" name="author" value="<?php echo $query2['author'];?>" >
<br/>
EnterPublisher:<input type="text" name="publisher" value="<?php echo $query2['publisher'];?>">
<br/>
EnterNumCopies:<input type="text" name="numcopies" value="<?php echo $query2['numcopies'];?>">
<br/>
EnterShelfNo:<input type="text" name="shelfno" value="<?php echo $query2['shelfno'];?>">
<br/>
<input type="hidden" name="bookid" value=<?php if(isset($bookid)) echo $bookid; ?>>
<select>
<option value="available" <?php if ($query2['status']=="Available") echo "selected";?>>Available</option>
<option value="unavailable" <?php if ($query2['status']=="Unavailable") echo "selected";?>>Unavailable</option>
</select>
<br>
<input type="submit" name="submit" value="Update">



</form>
</body>
</html>

编辑字段
身体{
背景色:rgb(255,0255);
}

EntertTitle:我认为不幸的是,您在这里遇到的是一种综合症的开始,因此您需要投资学习PHP。你将有更少的机会出现安全问题,你的脚本将从一开始就更干净,更容易维护,等等

对于这个特定的代码段,除其他外,您有一些问题,您可以通过
$\u GET
$\u POST
设置
bookid
,但是很难确定哪一个是最好的使用,在
标记上方会出现html,但您遇到的主要问题是,您的变量定义在
if
范围内,但也引用在
if
范围外,因此当
if
条件不满足时,将产生错误(更多参考)

除了解决范围问题之外,还有一些建议:

  • 使用带有参数绑定的
    PDO
    mysqli
    。我的例子使用
  • 在您的最终布局中使用或,同时考虑可用性和可读性(它看起来更复杂,正如我下面所说的,但只是因为它都粘贴在一个页面上。每个页面都应该是单独的)。所有这些
    $query
    $query1
    $query2
    等等都让人感到困惑。我使用过函数,但是类最好在内部将
    bookid
    传递给所有方法
  • 标准化您的图书id键名称,使其成为
    book\u id
    book id
    ,而不是两者兼而有之。我的示例使用
    bookid
  • 这可能有一些缺陷,但希望它能给您一些有用的想法,正如我之前所说的,作为一个类(实际上有几个类)实现这一点会更有用,但使用函数可能是帮助清理脚本的一个良好开端

    重要提示:我没有测试过这个(虽然应该没有语法错误),但是通过将您的版本与这个版本并行,您应该能够了解正在发生的事情以及这些事情的用途。如果你不理解它,请先仔细阅读,不要盲目地复制和粘贴,否则你会遇到更多的麻烦。正如他们所说的,使用风险自负

    /functions/getBooks.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/getBookById.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/getBook.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/updateBookById.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/updateBookTitle.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/getId.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/bookObserver.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/bookListObserver.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/getValue.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/bookList.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /functions/autoload.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /config.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    /index.php

    # Create a general function to fetch all books.
    function getBooks($con)
        {
            $result = array();
            $query = $con->prepare("SELECT * FROM books");
            $query->execute();
            while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                $result[] = $row;
            }
    
            return $result;
        }
    
    # Create a function to fetch a specific book by id
    function getBookById($id,$con)
        {
            $query = $con->prepare("SELECT * FROM books WHERE bookid = :id");
            $query->execute(array(":id"=>$id));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return (!empty($row))? $row : array();
        }
    
    # This should fetch from a global request, that way you can tell if
    # a book is currently being accessed
    function getBook($con)
        {
            autoload(array('getBookById','getId'));
            $id = getId('req');
            if(empty($id))
                return false;
    
            return getBookById($id,$con);
        }
    
    # Create an update function that can be accessed at anytime. Use binding
    # so you don't need to mess with any sort of escaping
    function updateBookById($id,$values,$con)
        {
            foreach($values as $keys => $vals) {
                $bKey = ":{$keys}";
                $bind[$bKey] = $vals;
                $sql[] = '`'.$key.'` = '.$bKey;
            }
            $bind[":id"] = $id;
            $query = $con->prepare("UPDATE books SET ".implode(', ',$sql)." WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This is is just a specific function to focus on title. Not sure you need
    # it since the update book by id function would do the same thing
    function updateBookTitle($id,$title,$con)
        {
            $bind[":id"] = $id;
            $bind[":title"] = $title;
            $query = $con->prepare("UPDATE books SET title = :title WHERE bookid = :id");
            $query->execute($bind);
        }
    
    # This will fetch the id value from a global
    function getId($type = false)
        {
            switch($type) {
                case('post'):
                    return (isset($_POST['bookid']))? $_POST['bookid'] : false;
                case('req'):
                    return (isset($_REQUEST['bookid']))? $_REQUEST['bookid'] : false;
                default:
                    return (isset($_GET['bookid']))? $_GET['bookid'] : false;
            }
        }
    
    # This will sit and just wait for the right globals activate it
    function bookObserver($con,&$curr)
        {
            autoload('getId');
            if(getId('req')) {
                autoload('getBookById');
                $books = getBookById(getId('req'),$con);
                if(!empty($books))
                    $curr = $books;
    
                if(isset($_POST['Update'])) {
                    $values = array(
                        'title' => $_POST['title'],
                        'author' => $_POST['author'],
                        'publisher' => $_POST['publisher'],
                        'numcopies' => $_POST['numcopies'],
                        'shelfno' => $_POST['shelfno'],
                        'status' => $_POST['status']
                    );
                    autoload('updateBookById');
                    updateBookById(getId('req'),$values,$con);
                }
            }
        }
    
    # This sits and waits for the update to write the table to the page
    function bookListObserver($current,$con)
        {
            if(isset($_POST['Update'])) {
                autoload('bookList');
                echo bookList(((!empty($current['status']))? $current['status'] : false),$con);
            }
        }
    
    # This will just check if a value is set. Saves on scripting
    function getValue($array,$key,$def = false)
        {
            return (!empty($array[$key]))? $array[$key] : $def;
        }
    
    # Displays your book list. Currently you are only showing the last book, 
    # which doesn't appear correct. No point in getting all books but only showing
    # the last one
    function bookList($selected = false,$con)
        {
            autoload('getBooks');
            $books = getBooks($con);
            ob_start();
            ?>
            <table>
                <tr>
                    <th>BookID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Publisher</th>
                    <th>numcopies</th>
                    <th>shelfno</th>
                    <th>status</th>
                    <th>Action</th>
                </tr>
            <?php foreach($books as $row) { ?>
                <tr>
                    <td><?php echo $row['title'] ?></td>
                    <td><?php echo $row['author'] ?></td>
                    <td><?php echo $row['publisher'] ?></td>
                    <td><?php echo $row['numcopies'] ?></td>
                    <td><?php echo $row['shelfno'] ?></td>
                    <td><?php echo $row['status'] ?></td>
                </tr>
            <?php } ?>
            </table>
            <?php
            if($selected == "Available") 
                echo "selected";
            elseif($selected == "Unavailable") 
                echo "selected";
    
            $data = ob_get_contents();
            ob_end_clean();
    
            return $data;
        }
    
    # This is your mysql connection, it requires attention to build out
    # It's not as useful as it could be, so you will want to research it
    function connect()
        {
            return new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
        }
    
    # This is just a handy function to autoload functions when you want
    # to use them. If you used classes, you would make an spl_autoload_register()
    # function or install something like Composer to autoload
    function autoload($name,$run = false)
        {
            if(is_array($name)) {
                foreach($name as $func) {
                    autoload($func);
                }
                return;
            }
    
            if(!function_exists($name)) {
                if(is_file($file = FUNCTIONS.DS.$name.'.php'))
                    include_once($file);
            }
    
            if($run) {
                if(function_exists($name))
                    return $name();
            }
        }
    
    # Make sure errors are on in testing
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    # Creating commonly-used defines will help your scripts be
    # more reliable and consistent
    define('DS',DIRECTORY_SEPARATOR);
    define('ROOT_DIR',__DIR__);
    define('FUNCTIONS',ROOT_DIR.DS.'functions');
    define('DB_HOST','localhost');
    define('DB_NAME','library book');
    define('DB_USER','root');
    define('DB_PASS','');
    # Start session by default
    session_start();
    require_once(FUNCTIONS.DS.'autoload.php');
    # Autoload the connect function and assign it
    $con = autoload('connect',true);
    
    <?php
    # Add config
    include(__DIR__.DIRECTORY_SEPARATOR.'config.php');
    # Include all our starting page functions
    autoload(array('bookObserver','bookListObserver','getBook', 'getValue'));
    # Set default array for current selection
    $current = array();
    # Start observer, pass connection
    bookObserver($con,$current);
    ?>
    <html>
    <head><title>Editing the fields</title>
    <style>
    body {
    background-color: rgb(255,0,255);
    }
    </style>
    </head>
    <body>
    <?php 
    # This writes the table if update is set
    # You should not put this html above the <html> tag
    bookListObserver($current,$con);
    # This gets the book from the page request
    $book = getBook($con);
    ?>
    <form action="edit1.php" action="post">
        EnterTitle:<input type="text" name="title" value="<?php echo getValue($book,'title') ?>"><br/>
        EnterAuthor:<input type="text" name="author" value="<?php echo getValue($book,'author') ?>" ><br/>
        EnterPublisher:<input type="text" name="publisher" value="<?php echo getValue($book,'publisher') ?>"><br/>
        EnterNumCopies:<input type="text" name="numcopies" value="<?php echo getValue($book,'numcopies') ?>"><br/>
        EnterShelfNo:<input type="text" name="shelfno" value="<?php echo getValue($book,'shelfno') ?>"><br/>
        <input type="hidden" name="bookid" value="<?php echo getValue($book,'bookid') ?>" />
        <select>
            <option value="available" <?php if(isset($current['status']) && $current['status'] == "Available") echo "selected";?>>Available</option>
            <option value="unavailable" <?php if (isset($current['status']) && $current['status'] == "Unavailable") echo "selected";?>>Unavailable</option>
        </select><br>
        <input type="submit" name="submit" value="Update">
    </form>
    </body>
    </html>
    
    
    编辑字段
    身体{
    背景色:rgb(255,0255);
    }
    
    输入标题:使用
    mysqli
    pdo
    扩展名
    mysql
    扩展已被弃用。请注意,不要这样做,
    bookid=$\u GET['book\u id']$str=“从bookid=$bookid的书籍中选择*”。这是清除数据库的一种简单方法。您应该在邮寄中发送图书id。“使用输入类型”具有“隐藏并再次搜索”以获取$query2,因为当您提交页面时,它将刷新页面,而此时您将获得$\u POST值而不是$\u get,因此它不会进入$\u get条件可能重复