Как получить доступ к базе данных sqlite3 из функции в PHP - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в SQLite и сейчас пытаюсь использовать его для проекта. Я создал функцию, которая вставляет новую строку, если она с таким именем еще не существует. Тем не менее, я не могу получить доступ к переменной базы данных внутри функции. Ничего не происходит.

Моя первая попытка выдает ошибку:

$db = new SQLite3("name.db");
$db->exec("CREATE TABLE IF NOT EXISTS warehouses (id INTEGER PRIMARY KEY, name VARCHAR(255), adjacent_l INTEGER DEFAULT null, adjacent_r INTEGER DEFAULT null, chem_a INTEGER DEFAULT 0, chem_b INTEGER DEFAULT 0, chem_c INTEGER DEFAULT 0, cap INTEGER)");

function newWH($name, $cap)
{
    $letResult = $db->query("SELECT * FROM warehouses WHERE name = " . $name);
    $letArray = (array) $letResult;
    if (empty($letArray)) {
        $db->query("INSERT INTO warehouses (name, cap) VALUES (" . $name . ", " . $cap . ")");
    }
}

newWH("wh1", 10);

Я попытался передать переменную db в качестве параметра. Сайт больше не выдает ошибку, но никаких вставок не происходит. (И да, я пробовал без предложения if: -)

$db = new SQLite3("name.db");
$db->exec("CREATE TABLE IF NOT EXISTS warehouses (id INTEGER PRIMARY KEY, name VARCHAR(255), adjacent_l INTEGER DEFAULT null, adjacent_r INTEGER DEFAULT null, chem_a INTEGER DEFAULT 0, chem_b INTEGER DEFAULT 0, chem_c INTEGER DEFAULT 0, cap INTEGER)");

function newWH($name, $cap, $letDb)
{
    $letResult = $letDb->query("SELECT * FROM warehouses WHERE name = " . $name);
    $letArray = (array) $letResult;
    if (empty($letArray)) {
        $letDb->query("INSERT INTO warehouses (name, cap) VALUES (" . $name . ", " . $cap . ")");
    }
}

newWH("wh1", 10, $db);

Ответы [ 2 ]

0 голосов
/ 08 мая 2018
  1. Лучше объявить ваш $db как global в функции
  2. ваш name столбец VARCHAR, поэтому вы должны заключить его значение в кавычки в инструкциях SQL

Таким образом:

$db = new SQLite3("name.db");
$db->exec("CREATE TABLE IF NOT EXISTS warehouses (id INTEGER PRIMARY KEY, name VARCHAR(255), adjacent_l INTEGER DEFAULT null, adjacent_r INTEGER DEFAULT null, chem_a INTEGER DEFAULT 0, chem_b INTEGER DEFAULT 0, chem_c INTEGER DEFAULT 0, cap INTEGER)");

function newWH($name, $cap)
{
    global $db;
    $letResult = $db->query("SELECT * FROM warehouses WHERE name = '$name'");
    $letArray = (array) $letResult;
    if (empty($letArray)) {
        $db->query("INSERT INTO warehouses (name, cap) VALUES ('$name', $cap)");
    }
}

newWH("wh1", 10);
  1. использовать параметризованные запросы и связывать переменные, чтобы избежать SQL-инъекций. ЭТО - хорошее начало, чтобы узнать, как использовать PDO с SQLite
  2. Если вас не волнует 3, то вы должны хотя бы экранировать кавычки символов в name
0 голосов
/ 08 мая 2018

Не проверено, но вы можете попробовать что-то вроде этого:

function newWH($name, $cap, $letDb)
{
    $letResult = $letDb->query("SELECT COUNT(*) as count FROM warehouses WHERE name = " . $name);
    $row = $letResult->fetchArray();
    if ($row > 0) {
        $letDb->query("INSERT INTO warehouses (name, cap) VALUES (" . $name. ", " . $cap . ")");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...