2017-04-10 118 views
0

我有這種形式與ajax腳本連接,當我提交長文本結果不保存在數據庫中(在posts表上,我有post_content列作爲「longtext」類型)。當我提交一些簡單的像「你好世界」)結果正確保存。當我用mysqli的,我已經解決了這個問題與這行代碼(使用mysqli_real_escape_string):PDO插入不工作

//$insert_posts = "INSERT INTO posts (post_content,post_date,post_topic,post_by_uid) VALUES ('".mysqli_real_escape_string($conn,$_POST['val'])."',NOW(),$id,'".$_SESSION['uid']."')"; 

但現在有PDO,我不能。我試過這個:$conn->quote($reply)但它沒有奏效。

<script> 
 
function saveEditorTrigger() 
 
{ 
 
    for (instance in CKEDITOR.instances) CKEDITOR.instances[instance].updateElement(); 
 
} 
 
</script> 
 
<script> 
 
\t $(function() { 
 
\t \t 
 
     $('form').on('submit', function (e) { 
 
\t \t saveEditorTrigger(); 
 
\t \t var str = CKEDITOR.instances['reply-post'].getData(); 
 
     var id = <?php echo $_GET['id']; ?>; 
 
\t \t e.preventDefault(); 
 

 
      $.ajax({ 
 
      type: 'post', 
 
      url: 'post.php', 
 
      data:{ val : str, id : id }, 
 
      success: function (data) { 
 
      alert('Your answer is submitted'); 
 
      location.replace("topic.php?id=<?php echo $_GET['id']; ?>"); 
 
\t \t \t } 
 
      }); 
 

 
     }); 
 

 
     }); 
 
    </script>
<form id="form" > 
 
\t \t \t \t <br> 
 
\t \t \t \t <textarea name="reply-post"></textarea> 
 
\t \t \t \t \t \t <script> 
 
\t \t \t \t \t \t CKEDITOR.replace("reply-post"); 
 
      </script> 
 
\t \t \t \t \t <input type="submit" name="submit" value="submit"> 
 
\t \t \t \t </form>

的post.php中的文件:

<?php 
 
include 'dbh.php'; 
 
session_start(); 
 
$reply = $_POST['val']; 
 
$id = $_POST['id'] ; 
 
$insert_posts = $conn -> prepare("INSERT INTO posts (post_content,post_date,post_topic,post_by_uid) VALUES ('".$reply."',NOW(),$id,'".$_SESSION['uid']."')"); 
 
//$insert_posts = "INSERT INTO posts (post_content,post_date,post_topic,post_by_uid) VALUES ('".mysqli_real_escape_string($conn,$_POST['val'])."',NOW(),$id,'".$_SESSION['uid']."')"; 
 
$insert_posts -> execute(); 
 

 
?>

我的問題是什麼我做錯了什麼?有任何想法嗎?

+0

瞭解有關[PDO] [製備](http://en.wikipedia.org/wiki/Prepared_statement)語句(http://php.net/manual/en/ pdo.prepared-statements.php)。您也可以避免潛在的SQL注入攻擊! PDO,[非常簡單](http://jayblanchard.net/demystifying_php_pdo.html)。 –

+0

好吧,對於初學者...您沒有正確使用PDO。 PDO的要點是不要將您插入到查詢中的值放入您的查詢中,並將它們作爲數組傳遞給插入對象。 – Dimi

+0

你的代碼*對SQL注入*是開放的*。當你檢查錯誤時,數據庫*可能*告訴你一個語法錯誤。糾正SQL注入問題,這個問題可能會變得沒有意義。 – David

回答

0
<?php 
include 'dbh.php'; 
session_start(); 
$reply = $_POST['val']; 
$id = $_POST['id'] ; 
$userId=$_SESSION['uid']; 
$insert_posts = $conn -> prepare("INSERT INTO posts 
       (post_content,post_date,post_topic,post_by_uid) 
       VALUES 
       (:post_content,:post_date,:post_topic,:post_by_uid)"); 
      $insert_posts->bindParam(':post_content', $reply, PDO::PARAM_STR); 
      $insert_posts->bindParam(':post_date', NOW(), PDO::PARAM_STR); 
      $insert_posts->bindParam(':post_topic', $id, PDO::PARAM_STR); 
      $insert_posts->bindParam(':post_by_uid', $userId, PDO::PARAM_STR); 
      $insert_posts -> execute(); 
?> 

https://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html可能是一個很好的資源,瞭解

+0

你的代碼看起來不錯,但根本不起作用....數據庫沒有記錄,即使是簡單的文本「你好世界」。唯一我得到的是「你的答案已提交」。 –

+0

嘗試先添加靜態數據,而不是從表單獲取值,$ reply =「Hello」;並運行腳本 – user3127648

+0

我剛剛嘗試過使用靜態數據,仍然沒有記錄... –

0

糾正這個代碼,我做它的工作。

<?php 
 
include 'dbh.php'; 
 
session_start(); 
 
$reply = $_POST['val']; 
 
$id = $_POST['id'] ; 
 
if (isset($_SESSION['uid'])){ 
 
$user=$_SESSION['uid']; 
 

 
$insert_posts = $conn -> prepare("INSERT INTO posts (post_content,post_date,post_topic,post_by_uid) VALUES (:post_content,NOW(),:post_topic,:post_by_uid)"); 
 
      $insert_posts->bindParam(':post_content', $reply); 
 
      $insert_posts->bindParam(':post_topic', $id); 
 
      $insert_posts->bindParam(':post_by_uid', $user); 
 
      $insert_posts->execute(); 
 
} 
 
?>