Невозможно вставить в базу данных SQLite через php PDO - PullRequest
3 голосов
/ 08 января 2011

Пожалуйста, помогите увидеть, что не так .... (Я проверяю, соединение с БД в порядке)

<?php
$user_name=$_POST['user_name'];
$password=$_POST['password'];

$dbh=new PDO('sqlite:./db/user.db') or die("fail to connect db");

try{
 $stmt = $dbh->prepare("INSERT INTO user_info VALUES (?, ?)");
 $stmt->bindParam(1, $a);
 $stmt->bindParam(2, $b);
 $a=$user_name;
 $b=$password;
 $stmt->execute();
}
catch(PDOException $e) {echo $e->getMessage();}

?>

Ответы [ 4 ]

6 голосов
/ 13 января 2012

У меня было время пересмотреть этот ответ после обсуждения с @DerrickCoetzee в комментариях. На самом деле ответ может быть единственным способом решить эту проблему на некоторых серверах. Я предложил предоставить универсальный доступ для записи в базу данных, что, по общему признанию, небезопасно. Я нашел причину, по которой это единственное решение, которое я мог найти, заключается в том, что мой сервер отключил доступ на запись для php. php неспособен создавать новые файлы, и я не могу изменить владельца базы данных на apache или «nobody» без root-доступа, что делает невозможным лучшее решение.

По сути, мой сервер заблокировал php так, что он может писать только если каждый может писать. На мой взгляд, это плохая настройка сервера, которая привела к этой угрозе безопасности, и, как предполагает @Derrick, sqlite db, вероятно, следует использовать только для частного использования или только для доступа к серверу. Некоторые системы не настроены так, чтобы использовать это безопасно . Если вы обнаружите, что у php нет прав на запись, и у вас нет доступа с правами root к компьютеру, вам следует обратиться к системному администратору или переключиться на MySQL, если он доступен.

При этом я считаю следующее решение очень удобным для быстрых решений для создания прототипов, когда БД не чувствительна или будет известна только небольшой избранной группе людей.


Мой предыдущий ответ:

У меня была точно такая же проблема сегодня! Я довольно новичок в php и sqlite, но пыхтел. Внезапно я столкнулся с этим огромным препятствием (без прогресса в течение дня) из-за отсутствия вставки в мою базу данных sqlite, как описано на плакате с вопросом. Отличительным фактором здесь является то, что нет сообщения об ошибке или исключения, только возвращение false, если вы помещаете инструкцию execute в предложение if.

Итак, я наконец-то смог найти способ заставить вставку работать, но я не уверен на 100%, безопасно это или нет. Буду признателен за любые комментарии, если вы думаете, что есть лучший способ.

Основная проблема заключается в том, что вы пытаетесь позволить своим пользователям писать в файл в вашей файловой системе. Однако по умолчанию папки и документы имеют доступ только для чтения для посторонних. Поэтому вам нужно предоставить доступ к записи для вашей базы данных (user.db) и ее папки (./db).

Итак, вам нужно перейти в каталог и набрать:

chmod 777 ./db
chmod 766 ./db/user.db

Это решило эту проблему для меня, поэтому я надеюсь, что это тоже поможет вам. Я не знаю, есть ли лучший способ или нет, но это кажется довольно логичным.

0 голосов
/ 22 октября 2012

попробуйте так:

$stmt = $dbh->prepare("INSERT INTO user_info VALUES (?, ?)");
$data = array($user_name, $password);
$stmt->execute($data);
0 голосов
/ 08 января 2011

Вы связываете $ a и $ b в качестве параметров перед их определением.

$user_name=$_POST['user_name'];
$password=$_POST['password'];
$a=$user_name;
$b=$password;

try{
 $stmt = $dbh->prepare("INSERT INTO user_info (user_name, password) VALUES (?, ?)");
 $stmt->bindParam(1, $a);
 $stmt->bindParam(2, $b);
 $stmt->execute();
}
catch(PDOException $e) {echo $e->getMessage();}

На самом деле, нет никакой необходимости присваивать значения сначала $ user_name и $ password. Просто назначьте их сначала $ a и $ b.

[Отредактированный SQL для включения имен столбцов]

0 голосов
/ 08 января 2011

Когда вы связываете ваши параметры $a и $b не существуют.

Попробуйте вместо этого:

 $stmt->bindParam(1, $user_name);
 $stmt->bindParam(2, $password);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...