2013-08-23 238 views
0

不知道是否有人可以幫忙。我試圖從表單中收集數據並將其插入到數據庫中,我如何不斷收到此錯誤:插入問題

Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\xampp\htdocs\test\form.php on line 49 該表由ID,名稱,電子郵件列組成。

的形式如下:

<form action="" method="post"> 
    Name *: <input type="text" name="name"><br/> 
    Email *: <input type="text" name="email"><br/> 
    <input type="submit" value="Submit"> 
</form> 

PHP腳本:

<?php 
if (isset($_POST['submit'])) { 
    $con = mysql_connect('localhost', 'root', '****'); 
    if($con) { 
     die("Can\'t connect"); 
    } 
    mysql_select_db('email_database', $con); 

    $sql = "INSERT INTO client_data (id, name, email) VALUES ('', '$_POST['name']', '$_POST['email']')"; 
    mysql_query($sql, $$con); 
    mysql_close($con); 
} 
?> 

我不知道我在做什麼錯:提前/ 感謝

+2

建議,[**唐」在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsq L)。他們不再被維護[並且被正式棄用](http://j.mp/XqV7Lp)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 –

+1

id列是否自動遞增? – Paddyd

回答

1

嘗試像

$sql = "INSERT INTO client_data (id, name, email) 
     VALUES (NULL, '".$_POST['name']."', '".$_POST['email']."')"; 

如果它是一個自動增量字段,則沒有必要提及它像

$sql = "INSERT INTO client_data (name, email) 
     VALUES ('".$_POST['name']."', '".$_POST['email']."')"; 

,並儘量避免mysql_*語句由於整個ext/mysql PHP擴展,它提供了與前綴mysql_*命名的所有功能,是正式棄用PHP v5.5.0,並將在未來刪除

有兩個其他MySQL的擴展,可以更好地利用:MySQLiPDO_MySQL,其中任何一個都可以用來代替ext/mysql

+0

問題在於引用 – donald123

+0

Yah我編輯過看過一次 – Gautam3164

+0

可能是一個想法,確保在插入空值之前該列是auto_increment – Anigel

0

查詢中的語法不正確!

這樣寫:

'".$_POST["name"]."' 

希望它能幫助!

0

你不能使用這樣的assoc數組! 你要做這樣的:

$sql = "INSERT INTO client_data (id, name, email) VALUES ('', '".$_POST['name']."', '".$_POST['email']."')" 
更好

是:

$sql = "INSERT INTO client_data (id, name, email) VALUES ('', '".mysql_real_escape_string($_POST['name'])."', '".mysql_real_escape_string($_POST['email'])."')" 

,以防止注射

0

你的查詢應該像現在這樣,

<?php 
$sql = "INSERT INTO client_data (id, name, email) VALUES ('', '".$_POST['name']."', '".$_POST['email']."')";  
?> 

它是最好將ID字段設置爲自動增量字段。那麼你的查詢會是這樣的,

<?php 
    $sql = "INSERT INTO client_data (name, email) VALUES ('".$_POST['name']."', '".$_POST['email']."')";  
?> 
0

你有一個單引號和雙引號的問題。

而且,是id一個auto_increment,因爲如果是這樣,那麼你應該排除現場一起

即:

$sql = "INSERT INTO client_data (name, email) VALUES ('" . mysql_real_escape_string($_POST['name']) . "', '" . mysql_real_escape_string($_POST['email']) . "')"; 

如果不是:

$sql = "INSERT INTO client_data (id, name, email) VALUES ('', '" . mysql_real_escape_string($_POST['name']) . "', '" . mysql_real_escape_string($_POST['email']) . "')"; 

mysql_real_escape_string應用於任何用戶輸入或可編輯的數據。

然而,正如其他人可能會提到:你真的應該看看升級你的mysql調用像mysqli_*PDO_MYSQL

0
從明顯的語法錯誤和SQL注入/逃避問題,你不驗證用戶輸入

除了或錯誤處理。

不幸的是,它與這種無保護方法一致;你很快就會發現你的數據庫很快就會充滿偉哥,廉價手錶和服裝關鍵字和XSS代碼。

下面是一個使用PDO準備查詢的使用更安全的代碼,做任何形式的更安全,你應該添加一個驗證碼端口/例如:

<?php 
session_start(); 

try { 
    $db = new PDO('mysql:host=127.0.0.1;dbname=email_database','root','****'); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $db->exec("SET CHARACTER SET utf8"); 
} catch(PDOException $e) { 
    echo 'Database connection error :' . $e->getMessage(); 
} 

if($_SERVER['REQUEST_METHOD'] === 'POST'){ 
    //csrf token 
    if(!isset($_SESSION['token']) || !isset($_POST['token']) || $_SESSION['token'] != $_POST['token']) 
    exit('Invalid request token'); 

    //Validate input values 
    $error = array(); 
    //Name 
    if(empty($_POST['name'])){ 
     $error['name'] = "Your name is required"; 
    } 
    //Email 
    if(!empty($_POST['email'])){ 
     if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){ 
      $error['email'] = "A Valid email is required"; 
     } 
    }else{ 
     $error['email'] = "Your email is required"; 
    } 

    //ok no error lets insert 
    if(empty($error)){ 
     $sql = 'INSERT INTO client_data (name, email) VALUES (:name, :email)'; 
     $stmt = $db->prepare($sql); 
     $stmt->bindParam(':name', $_POST['name']); 
     $stmt->bindParam(':email', $_POST['email']); 
     $stmt->execute(); 
    } 

    //Token used for this request, remove 
    unset($_SESSION['token']); 
} 

//set csrf token 
$_SESSION['token'] = hash('sha256', uniqid()); 
?> 

<form action="" method="POST"> 
    <input type="hidden" name="token" value="<?php echo $_SESSION['token'];?>"/> 
    Name *: <input type="text" name="name"/> <?php echo isset($error['name']) ? $error['name'] : null;?><br/> 
    Email *: <input type="text" name="email"/> <?php echo isset($error['email']) ? $error['email'] : null;?><br/> 
    <input type="submit" value="Submit"/> 
</form> 

Don't use mysql_* functions in new code。他們不再保留and are officially deprecated。請參閱red box?請改爲了解prepared statements,並使用PDOMySQLi - this article將幫助您決定哪個。如果您選擇PDO,here is a good tutorial

0

使用的MySQLi,而不是過時的MySQL

PHP腳本應該是這樣的:

<?php 

if (isset($_POST['submit'])) { 

$con=mysqli_connect("localhost","root","****","email_database"); 

if(mysqli_connect_errno()){ 

echo "Error".mysqli_connect_error(); 
} 

mysqli_query($con,"INSERT INTO client_data (id, name, email) VALUES ('', '$_POST[name]', '$_POST[email]')"); /* YOU SHOULD HAVE REMOVED THE SINGLE QUOTE (') INSIDE $_POST[] */ 
} 

?>