2014-05-03 88 views
1

實際上,我對此感到陌生,並且遇到了插入到mysql屬性的問題。無法在php中使用MYSQL INSERT INTO

我創建了兩個表格,即問題和答案。用戶可以通過html表單提交數據(對於兩個表)。由於一些未知的錯誤,數據沒有插入到答案表中,問題表沒有這樣的問題。 奇怪的是,兩個表的插入php代碼除了變量的名字幾乎相同。

singleques_info.php代碼:

<?PHP 

session_start(); 
$t=$_GET['p']; 
$ans= ""; 
$error_message = ""; 
$num_rows = 0; 

function quote_smart($value, $handle) 
{ 
    if (get_magic_quotes_gpc()) 
     { 
     $value = stripslashes($value); 
     } 
    if (!is_numeric($value)) 
     { 
     $value = "'" . mysql_real_escape_string($value, $handle) . "'"; 
     } 
    return $value; 
    } 

if ($_SERVER['REQUEST_METHOD'] == 'POST') 
    { 
     $ans = $_POST['ans']; 
     $ans = htmlspecialchars($ans); 
     $uLength = strlen($ans); 
     if ($uLength <=100) 
      { 
     $error_message = ""; 
      } 
      else 
      { 
      $error_message = $error_message . "Username must be between 10 and 20 characters" . "<BR>"; 
      } 


    if ($error_message == "") 
     { 
     $username = "root"; 
     $password = ""; 
     $database = "techinsight"; 
     $server = "127.0.0.1"; 
     $db_handle = mysql_connect($server, $username, $password); 
     $db_found = mysql_select_db($database, $db_handle); 

     if ($db_found) 
     { 
     echo "connected"; 
     $ans = quote_smart($ans, $db_handle); 
     $SQL = "SELECT * FROM answers WHERE answer= $ans"; 
     $result = mysql_query($SQL); 
     $num_rows = mysql_num_rows($result); 
      if ($num_rows > 0) 
      { 
      echo "Question already taken"; 
      } 
      else 
      }       
      $SQL = "INSERT INTO answers (Aid, answer, date) VALUES ($t, $ans, CURDATE())"; 
      $result = mysql_query($SQL); 
      mysql_close($db_handle); 

      session_start(); 
      $_SESSION['login'] = "1"; 

      header ("Location:ques_wala_main.php"); 
      echo "You are done."; 
      } 

     } 
     else 
     { 
      $errorMessage = "Database Not Found"; 
     } 

     } 
     //<div class="content_mess"> 
    /* else 
     { 
      session_start(); 
      $_SESSION['login'] = ""; 
      header ("Location: signup.php"); 
      echo "Please SignIn Before Asking...."; 
     } 
    // </div> */ 

} 

?> 

HTML表單:

<form id="ans" method="POST" name="ans" action="#"> 
    <div class="field extra"> 
    <label>your answer:</label> <br/> <br/> <br/> 
    <textarea name="ans" cols="70" rows="6"></textarea> 
    </div> 
    <br/> <br/> 
    <input type="submit" name="submit" value="submit" /> 
</form> 
+0

我也注意到你連接到DB ** **後,如果'($ ERROR_MESSAGE == 「」)'並在此之前訪問'mysql_real_escape_string($ value,$ handle)'。你上面連接到數據庫嗎? –

+0

另外,使用'$ t = $ _ GET ['p'];'這是來自POST方法的GET方法。 '$ t = $ _ GET ['p'];'從哪裏填充? –

+0

實際上,此處使用GET方法從通過url傳遞的另一個頁面檢索變量。 – shibu

回答

1

的問題已經解決了OP加入以下腳本的頂部(S):

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

有找在服務器上不再支持mysql_*函數,並且不得不求助於切換到mysqli_*函數。

這已經通過多種意見談得OP。


當現在使用mysqli_*功能(帶有一個額外的選項):

添加錯誤報告給您的文件(S),這將在生產測試幫助的頂部。

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

MySQL的(錯誤報告的鏈接)


額外的API:

Use mysqli with prepared statements,或PDO

PDO的錯誤處理:

0

這個問題已經回答了評論,但我會擴大。

你似乎對兩個方面感到困惑。首先是您正在使用的SQL語句的正確準備。每個陳述包含兩個重要部分。您指定:

  1. 表中的列要使用:

    INSERT INTO答案(援助,答案,日期)

  2. 和值要與這些列使用方法:

    VALUES($噸,$ ANS,CURDATE())

MySQL syntax允許你在沒有空格(或其他字符)的情況下讓列名解封,所以這個部分沒問題。然而,取決於列類型的值可能必須用單引號或雙引號封裝,例如,你必須封裝值VARCHARDATEDATETIMEBLOB但對於數字類型,你通常不應這樣做像INTDECIMAL或當你告訴MySQL服務器計算的東西它插入新記錄之前(如CURDATE()10 + 5等)。因此,假如你的欄目有:

Aid - INT 
answer - VARCHAR 
date - DATE 

正確的SQL語句是(注意周圍$ans單引號和缺乏引號周圍CURDATE()):

INSERT INTO answers (Aid, answer, date) VALUES ($t, '$ans', CURDATE()) 

其他方面似乎迷惑你是如何PHP deals with strings。你正在做的是告訴PHP準備一行文本(字符串)並將其傳遞到MySQL服務器,以便服務器運行它並將結果傳遞迴PHP(例如mysql_insert_id()就是這樣的結果)。從這個過程的開始到結束,PHP都不知道SQL語句是什麼以及如何準備它。它所知道的是「這裏是一個字符串,我需要在其中添加一些變量」。因此,假如答案數32a submitted answer,你的代碼的這兩部分:

$SQL = "SELECT * FROM answers WHERE answer= $ans"; 
[...] 
$SQL = "INSERT INTO answers (Aid, answer, date) VALUES ($t, $ans, CURDATE())"; 

會產生以下正確的字符串,但不正確的SQL語句:

SELECT * FROM answers WHERE answer= a submitted answer 
INSERT INTO answers (Aid, answer, date) VALUES (32, a submitted answer, CURDATE()) 

希望的解決方案是現在很明顯。

上面說的,我只是迴應支付它前進(我們所有的人必須從某個地方開始)。這種編碼風格已經過時,而且值得討論(甚至作爲一種學習手段)。它永遠不會看到生產環境。

編輯:

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead 

上面應該是一個通知水平,可能不是一個問題。如果您想查詢功能是否可用運行下面的腳本:

<?php 
    $a = array(
     'mysql_connect', 
     'mysql_real_escape_string', 
     'mysql_query', 
     'mysql_fetch_assoc', 
    ); 

    foreach ($a as $f) 
     var_dump(function_exists($f)); 
+0

請在你的回答中加入'$ ans'必須被引用爲'$ SQL =「SELECT * FROM answers WHERE answer = $ ans」;' –