2013-06-19 5 views
0

Поэтому, когда кто-то нажимает эту ссылку, он должен вставить все данные из этого текстового идентификатора в новую таблицу, но с именем пользователя, щелкнувшим по нему, и идентификатором текста, который нажал пользователь.Не вставлять данные в базу данных по ссылке

Проблема в том, что когда пользователь нажимает на ссылку, она не вставляет данные, что может быть неправильно?

Сессия работает, так что это должно быть что-то с GET?

<?php 
if(isset($_GET['collect'])) { 
    $perman = $_GET['collect']; 
    $username = $_SESSION['username']; 

    $query = $dbh->query("INSERT INTO collections (id, ad, user) VALUES ('', $perman, $username)"); 
    echo 'Saving'; 
    echo $perman; 
    header ('Refresh: 1; URL=http://localhost/de/collect.php'); 
} 

?>

+0

Вы подключены к базе данных? Вы получаете сообщения об ошибках? Вы должны действительно использовать подготовленные инструкции, чтобы избежать инъекций SQL. – Havsmonstret

+0

Я подключен к базе данных, да. Сообщение об ошибке, которое я получаю, это «Неизвестный столбец« patrik »в« списке полей ». Это пользователь, который вошел в систему. Если я вхожу в систему как кто-то другой, он скажет« Неизвестный столбец »этого пользователя». Обычно я использую подготовленные заявления. Просто попробовал с запросом в этом случае, и я изменю его, как только я получу это исправление. – user2328659

ответ

0

Во-первых, вставка '' для ID не очень хорошо (не знаю, если он работает), не использовать его (используется по умолчанию), или вставить NULL (использование default, если NOT NULL). Во-вторых, чтобы вставить значения, это хорошая практика, чтобы вставить в нее команду и использовать escape_string. Я думаю, это твоя проблема.

$query = $dbh->query("INSERT INTO collections (ad, user) VALUES ('" . $dbh->escape_string($perman) . "', '" . $dbh->escape_string($username) . "')"); 
0

Вы отметили свой вопрос с помощью «PDO». Вы используете PDO? Если да, то почему вы не используете bindParam() или bindValue()?

Если $ Perman и $ имя пользователя являются строками, вы, чтобы избежать их:

$query = $dbh->query("INSERT INTO `collections` (`id`, `ad`, `user`) VALUES ('', '{$perman}', '{$username}')"); 

Этот запрос должен работать, но есть еще вопросы безопасности. Вы должны избегать значений. С PDO это очень просто.

Общие сведения: использовать http://php.net/manual/en/function.mysql-error.php

столбце "идентификатор" должен быть Integer и иметь auto_increment. Конечно, некоторые идентификаторы - это строки, но если вы можете избежать этого, избегайте этого!

Вы можете распечатать $ _GET Params с помощью

print_r($_GET); 

Редактировать Пример с PDOStatement :: bindValue():

$stmt = $dbh->prepare("INSERT INTO `collections` (`id`, `ad`, `user`) VALUES (:id, :ad, :user)"); 
$stmt->bindValue(":id", 123); 
$stmt->bindValue(":ad", "ad"); 
$stmt->bindValue(":user", "username"); 
$stmt->execute(); 
+0

Спасибо, это работает. Но что я должен связывать Параму в этом случае? Еще раз спасибо – user2328659

+0

Ваши переменные $ pers и $ username еще не удалены. Если вы связываете их с PDO, вам не нужно делать это самостоятельно. Если вы не избежите своих ценностей, хакеры смогут атаковать ваш код простыми инъекциями. –

+0

@ user2328659 см. [Как предотвратить SQL-инъекцию в PHP?] (Http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php) –

0

Вы должны делать это так .. .если вы используете PDO

Гораздо безопаснее, с подготовленными операциями

$sql = "INSERT INTO books (id,ad,user) VALUES (:id,:ad,:user)"; 
$q = $conn->prepare($sql); 
$q->execute(array(':id'=>null,':ad'=>$perman,':user'=>$username)); 
Смежные вопросы