2017-01-31 6 views
-1

Здесь моя цель - обновить информацию о книге с заголовком, который я установил в текстовое поле. Но в моем коде я, когда я бегу, получаю ошибку, так как $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> 
+3

использование '' mysqli' или pdo' расширение. Расширение 'mysql' устарело. –

+2

Боковое примечание, не делайте этого, '$ bookid = $ _GET ['book_id']; $ str = "select * from books where bookid = $ bookid"; '. Это простой способ для уничтожения базы данных. – Rasclatt

+0

вам следует отправить идентификатор книги в сообщении. используйте тип ввода, который скрывает и снова ищет, чтобы получить $ query2, потому что, когда вы отправляете страницу, она обновит страницу, и в это время вы получите значение $ _POST не $ _GET, чтобы оно не перешло в условие $ _GET. –

ответ

1

Я думаю, что, к сожалению, что ты здесь происходит зачатки "spaghetti code" синдрома, так что вы хотите инвестировать в изучении PHP framework. У вас будет меньше шансов проблем безопасности, ваш сценарий будет чист от идти, более-легко поддерживать и т.д.

Для этого конкретного фрагмента кода, помимо всего прочего, у вас есть sql injection вопросов, вы установили bookid по $_GET и $_POST, но трудно определить, какой из них лучше всего использовать, у вас есть html, который происходит выше тега <html>, но основная проблема, с которой вы столкнулись, состоит в том, что у вас есть переменные, которые определены в области if, но также упоминаются вне этого диапазона if поэтому создаст ошибку (ошибки), если условие if не выполнено (See this example для дополнительной справки).

Некоторые предложения, кроме фиксации проблемы Область применения:

  1. Использование PDO или mysqli_ с обязательным параметром. Мой пример использует PDO
  2. Использования functions или class/method как для удобства и читаемости в вашей окончательной компоновке (она выглядит более сложной, как у меня есть это ниже, но только потому, что это все наклеенные на одной странице. Каждая страница должна быть отделена). Все это $query, $query1, $query2 и т. Д. Запутывается. Я использовал функции, но класс лучше было бы пройти bookid ко всем методам внутри.
  3. Стандартизируйте название своей книги id, либо сделайте это book_id или bookid, не оба. В моем примере используется 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; 
    } 

/functions/getBookById.php

# 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(); 
    } 

/функции/getBook.PHP

# 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); 
    } 

/functions/updateBookById.php

# 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); 
    } 

/functions/updateBookTitle.php

# 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); 
    } 

/functions/getId.php

# 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; 
     } 
    } 

/functions/bookObserver.php

# 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); 
      } 
     } 
    } 

/functions/bookListObserver.php

# 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); 
     } 
    } 

/functions/getValue.php

# 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; 
    } 

/functions/bookList.php

# 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; 
    } 

/functions/connect.php

# 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); 
    } 

/functions/autoload.php

# 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(); 
     } 
    } 

/конфи g.php

# 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); 

/index.php

<?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>