PHP подготовил заявления - новичок - PullRequest
0 голосов
/ 03 декабря 2011

Я пытаюсь вставить в журнал вызовов таблицы набор значений, используя подготовленные операторы mysqli.У меня есть 2 функции save_timecard_entry, которые, если я использую все вставки данных POST без проблем.Однако у меня есть вторая функция, в которой я пытаюсь найти идентификатор из другой таблицы, называемой клиентами, и затем использовать этот идентификатор для вставки в первую таблицу.Не могу заставить его работать

$this->conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) etc.....

function save_timecard_entry(){
    if(isset($_POST['submit'])){
        $date = $_POST['date'];
        $client = fetch_id($_POST['client']);
        $job = $_POST['job'];
        $task = $_POST['task'];
        $time = $_POST['time'];
        $username = 2;

        $query = "INSERT INTO log VALUES (NULL,?,?,?,?,?,?)";

        if($stmt = $this->conn->prepare($query)){
            $stmt->bind_param('siiiii', $date, $client, $job, $task, $time, $username);
            $stmt->execute();
            $stmt->close();
        }
    } else{
        echo 'error' . $this->conn->error;
    }


}

function fetch_id($name){
    if($stmt = $this->conn->prepare("SELECT id, FROM clients WHERE name =?")){
        $stmt->bind_param("ss", $name);
        $stmt->execute();
        $stmt->bind_result($id);
        $stmt->fetch();
        return $id;
        $stmt->close;
    } 
}

Ответы [ 4 ]

1 голос
/ 03 декабря 2011

Существует только один параметр, который необходимо связать, но вы передаете строку типа данных с 2 буквами.

Правильный bind_param вызов:

$stmt->bind_param('s', $name);

Я бытакже выполните некоторую проверку ошибок, очень вероятно, что $stmt->bind_param() вернул false, вы хотели бы проверить это до фактического выполнения запроса.

0 голосов
/ 03 декабря 2011

Я вижу несколько проблем, одна из которых уже упоминалась. Во втором запросе вы связываете две строковые переменные "ss", но в запросе у вас есть только одна переменная.

Кроме того, в первом запросе вы связываете параметры как «siiiii». Это одна строка, за которой следуют пять целых чисел. Однако одним из ваших параметров является значение $ time, которое вы, очевидно, получаете из поста формы. Как эта переменная $ time генерируется в вашей форме? Php time () возвращает целое число, но если вы позволяете людям вводить в форму время, например, 23:30, то это будет строка, а не целое число. Запрос не будет работать должным образом, если вы пытаетесь связать строку как целое число.

0 голосов
/ 03 декабря 2011

Вы не можете использовать PDOStatement->bindParam таким образом. Если вы хотите связать все ваши параметры одновременно, вы можете использовать PDOStatement->execute вместо этого, поскольку он принимает массив с параметрами:

$stm->execute(array($date, $client, $job, $task, $time, $username));
0 голосов
/ 03 декабря 2011

Не выполнил, но есть запятая после «id», которая должна быть удалена из запроса, чтобы работать как положено:

    if ($stmt = $this->conn->prepare("SELECT id FROM clients WHERE name = ?")) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...