Как из php передать в sql переменную, как название новой таблицы?
Как передать переменную с php в процедуру mysql
Создаю процедуру CREATE DEFINER = `root`@`localhost` PROCEDURE `rep` ( IN `p_id` INT ) NOT.
Как передать значение переменной JS в переменную PHP?
Как передать значение переменной JS в переменную PHP? Можно и в сессионную переменную.
Как вместо названия таблицы в sQL-запросе можно подставить переменную, данное название содержащую?
Проблема такая. Каким образом вместо названия таблицы в sQL-запросе можно подставить переменную.
не работает, но дальше
в базу записывает
Добавлено через 13 минут
MySQL server version for the right syntax to use near ‘346767’ at line 1 . спасибо
он к переменной добавляет ‘ ‘
Сообщение было отмечено Vic-Tor как решение
Решение
Vic-Tor, Конечно странно что не работает без `, я использую обычно
Строка из моего кода.
Сообщение от N3stY
ads, Это вы о чем?
Я не приводил пример как именно должна быть прописана функция, я имел ввиду кавычки.
Не знаете о чем идет речь, лучше промолчать однако
Добавлено через 8 минут
Сообщение от N3stY
ничего странного нет. То, что у вас работает и без них означает лишь то, что у вас нет названий, состоящих из зарезервированных слов или отличных от букв, цифр, и подчеркивания символов
Добавлено через 1 минуту
И да, как минимум, переменную перед запросом необходимо очистить от возможных инъекций
Сообщение от KOPOJI
Сообщение от KOPOJI
Как передать переменную в PHP?
помогите передать переменную из js в PHP. перепробовал все , но в php появляется только значения и.
MS SQL 70. Как передать название БД в хран. процед.? Помогите.
Есть хранимая процедура, в качестве параметра которой хотелось бы использовать название БД. К.
Как передать переменную с php в javascript
Подскажите кто знает. Меня есть метод в контроллере написан на php. function actionView() < .
Вставить переменную PHP в запрос INSERT INTO MySQL
Я пытаюсь вставить переменную PHP в запрос “INSERT INTO” MySQL. Я попробовал много комбинаций без везения.
Я могу подтвердить, что $ testing_for содержит строку – я проверил это, вызывая var_dump прямо перед этим.
Любая помощь очень ценится, спасибо заранее
* edit: извините, забыли упомянуть, что эти входы. $ testing_for. и проверить в столбцах уважения, когда я смотрю в таблицу, используя phpmyadmin *
Исправьте свои цитаты…
Это было уловлено редактором SO markdown ^ _ ^
Вы должны использовать двойные кавычки, если вы хотите напрямую вставлять переменные в строки:
Или просто используйте . оператор:
Здесь я вставляю две переменные с текущей датой
now() → теперь функция вставляет текущую дату и время
Ваш $ sql находится в пределах одного апострофа, поэтому использование цитаты, чтобы оставить строку, не работает. Либо изменение
PDOStatement::bindParam
Связывает переменную PHP с именованным или неименованным параметром подготавливаемого SQL-запроса. В отличие от PDOStatement::bindValue() , переменная привязывается по ссылке и её значение будет вычисляться во время вызова PDOStatement::execute() .
В большинстве случаев в подготавливаемых запросах используются только входные параметры, то есть при построении запроса доступ к ним осуществляется только в режиме чтения (возможно приведение в соответствии с type ). Тем не менее, некоторые драйверы позволяют запускать хранимые процедуры, которые, в свою очередь, могут возвращать данные посредством выходных параметров. Зачастую, такие параметры используются одновременно как входные и как выходные.
Список параметров
Идентификатор параметра. Для подготавливаемых запросов с именованными параметрами это будет имя в виде :name . Если используются неименованные параметры (знаки вопроса ?) это будет позиция псевдопеременной в запросе (начиная с 1).
Имя переменной PHP, которую требуется привязать к параметру SQL-запроса.
Явно заданный тип данных параметра. Тип задаётся одной из констант PDO::PARAM_* . Если параметр используется, в том числе для вывода информации из хранимой процедуры, к значению аргумента type необходимо добавить PDO::PARAM_INPUT_OUTPUT , используя оператор побитовое ИЛИ.
Размер типа данных. Чтобы указать, что параметр используется для вывода данных из хранимой процедуры, необходимо явно задать его размер. Имеет значение, только если у параметра type установлено значение PDO::PARAM_INPUT_OUTPUT .
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Ошибки
Выдаёт ошибку уровня E_WARNING , если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING .
Выбрасывает исключение PDOException , если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION .
Примеры
Пример #1 Выполнение подготовленного запроса с именованными псевдопеременными
Пример #2 Выполнение подготовленного запроса с неименованными псевдопеременными (?)
Пример #3 Вызов хранимой процедуры с INOUT-параметром
Смотрите также
- PDO::prepare() — Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
- PDOStatement::execute() — Запускает подготовленный запрос на выполнение
- PDOStatement::bindValue() — Связывает параметр с заданным значением
User Contributed Notes 25 notes
I know this has been said before but I’ll write a note on it too because I think it’s important to keep in mind:
If you use PDO bindParam to do a search with a LIKE condition you cannot put the percentages and quotes to the param placeholder ‘%:keyword%’.
This is WRONG:
«SELECT * FROM `users` WHERE `firstname` LIKE ‘%:keyword%'»;
The CORRECT solution is to leave clean the placeholder like this:
«SELECT * FROM `users` WHERE `firstname` LIKE :keyword»;
And then add the percentages to the php variable where you store the keyword:
$keyword = «%».$keyword.»%»;
And finally the quotes will be automatically added by PDO when executing the query so you don’t have to worry about them.
So the full example would be:
<?php
// Get the keyword from query string
$keyword = $_GET [ ‘keyword’ ];
// Prepare the command
$sth = $dbh -> prepare ( ‘SELECT * FROM `users` WHERE `firstname` LIKE :keyword’ );
// Put the percentage sing on the keyword
$keyword = «%» . $keyword . «%» ;
// Bind the parameter
$sth -> bindParam ( ‘:keyword’ , $keyword , PDO :: PARAM_STR );
?>
Note that when using PDOStatement::bindParam an integer is changed to a string value upon PDOStatement::execute(). (Tested with MySQL).
This can cause problems when trying to compare values using the === operator.
Example:
<?php
$active = 1 ;
var_dump ( $active );
$ps -> bindParam ( «:active» , $active , PDO :: PARAM_INT );
var_dump ( $active );
$ps -> execute ();
var_dump ( $active );
if ( $active === 1 ) <
// do something here
// note: this will fail since $active is now «1»
>
?>
results in:
int(1)
int(1)
string(1) «1»
There seems to be some confusion about whether you can bind a single value to multiple identical placeholders. For example:
$sql = «SELECT * FROM user WHERE is_admin = :myValue AND is_deleted = :myValue «;
$params = array(«myValue» => «0»);
Some users have reported that attempting to bind a single parameter to multiple placeholders yields a parameter mismatch error in PHP version 5.2.0 and earlier. Starting with version 5.2.1, however, this seems to work just fine.
When binding null data to server columns of type varbinary, binary, or varbinary(max) you should specify binary encoding (PDO::SQLSRV_ENCODING_BINARY) using the $driver_options. See Constants for more information about encoding constants.
Support for PDO was added in version 2.0 of the Microsoft Drivers for PHP for SQL Server.
<?php
$db = new PDO ( ‘sqlsrv:server=SQLSERVERNAME;Database=own_exchange’ , ‘user’ , ‘password’ );
$sql = «INSERT INTO dbo.files(file_name, file_source) VALUES(:file_name, :file_source)» ;
$stmt = $db -> prepare ( $sql );
$stmt -> bindParam ( «:file_name» , $files -> name , PDO :: PARAM_STR );
$stmt -> bindParam ( «:file_source» , file_get_contents ( $files -> tempName ), PDO :: PARAM_LOB , 0 , PDO :: SQLSRV_ENCODING_BINARY );
$stmt -> execute ();
?>
SQL Server 2008 R2
If this was in the documentation, I didn’t stumble across it. When using bound output parameters with a stored procedure, the output parameters are updated AFTER the LAST rowset has been processed.
If your stored procedure does not return any rowsets (no SELECT statements) then you are set, your output parameters will be ready as soon as the stored procedure is processed.
Otherwise you need to process the rows, and then:
<?php $stmt -> nextRowset (); ?>
Once that is done for each returning rowset you will have access to the output parameters.
Please note, that PDO format numbers according to current locale. So if, locale set number format to something else, that standard that query WILL NOT work properly.
For example:
in Polish locale (pl_PL) proper decimal separator is coma («,»), so: 123,45, not 123.45. If we try bind 123.45 to the query, we will end up with coma in the query.
<?php
setlocale ( LC_ALL , ‘pl_PL’ );
$sth = $dbh -> prepare ( ‘SELECT name FROM products WHERE price < :price’ );
$sth -> bindParam ( ‘:price’ , 123.45 , PDO :: PARAM_STR );
$sth -> execute ();
// result:
// SELECT name FROM products WHERE price < ‘123,45’;
?>
Note that with bindParam the second parameter is passed by reference. This means that the following will produce a warning if E_STRICT is enabled:
<?php
$stmt -> bindParam ( ‘type’ , $object -> getType ());
// Strict Standards: Only variables should be passed by reference in /path/to/file.php on line 123
?>
If the second parameter is not an actual variable, either set the result of $object->getType(); to a variable and use that variable in bindParam or use bindValue instead.
Do not try to use the same named parameter twice in a single SQL statement, for example
<?php
$sql = ‘SELECT * FROM some_table WHERE some_value > :value OR some_value < :value’ ;
$stmt = $dbh -> prepare ( $sql );
$stmt -> execute ( array( ‘:value’ => 3 ) );
?>
. this will return no rows and no error — you must use each parameter once and only once. Apparently this is expected behavior (according to this bug report: http://bugs.php.net/bug.php?id=33886) because of portability issues.
Took me forever to find this elsewhere in the notes in the manual, so I’d thought I’d put this tidbit here to help others in the future.
When using a LIKE search in MySQL along with a prepared statement, the *value* must have the appropriate parentheses attached before the bindParam() statement as such:
<?php
$dbc = $GLOBALS [ ‘dbc’ ];
$sql = «SELECT * FROM `tbl_name` WHERE tbl_col LIKE ?» ;
$stmt = $dbc -> prepare ( $sql );
$value = «% < $value >%» ;
$stmt -> bindParam ( $i , $value , PDO :: PARAM_STR );
?>
Trying to use
<?php
$stmt -> bindParam ( $i , «% < $value >%» , PDO :: PARAM_STR );
?>
will fail.
A caution for those using bindParam() on a placeholder in a
LIKE ‘%. %’ clause, the following code will likely not work:
<?php
$q = «SELECT id, name FROM test WHERE name like ‘%:foo%'» ;
$s = «carrot» ;
$sth = $dbh -> prepare ( $q );
$sth -> bindParam ( ‘:foo’ , $s );
$sth -> execute ();
?>
What is needed is something like the following:
<?php
$s = «% $s %» ;
$sth -> bindParam ( ‘:foo’ , $s );
?>
This should work. Tested against mysql 4.1, PHP 5.1.3.
The documentation says this about the length parameter for bindParam:
«To indicate that a parameter is an OUT parameter from a stored procedure, you must explicitly set the length. «
For db2, I found that setting the length for the «INPUT_OUTPUT» parameters causes a problem for varchar parameters that are input parameters. The problem I found is that the stored procedure was called, but varchar input parameters were set to null inside my stored procedure and as a result, the stored procedure could not work properly.
Here is the signature for my stored procedure:
CREATE OR REPLACE PROCEDURE MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME ( IN RUN_ID INTEGER,IN V_SCHEMA_NAME VARCHAR(128),
OUT out_rc INTEGER,OUT out_err_message VARCHAR(100),OUT out_sqlstate CHAR(5) ,OUT out_sqlcode INT)
Here is the php code that works:
$command = «Call MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME (. )»;
$stmt = $this->GuestDb->prepare($command);
$stmt->bindParam(1, $RUN_ID, PDO::PARAM_INT);
$stmt->bindParam(2, $V_SCHEMA_NAME, PDO::PARAM_STR);
$stmt->bindParam(3, $V_TABNAME, PDO::PARAM_STR);
$stmt->bindParam(4, $out_rc, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(5, $out_err_message, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(6, $out_sqlstate, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(7, $out_sqlcode, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
Here is the php code that does not work:
$command = «Call MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME (. )»;
$stmt = $this->GuestDb->prepare($command);
$stmt->bindParam(1, $RUN_ID, PDO::PARAM_INT,12);
$stmt->bindParam(2, $V_SCHEMA_NAME, PDO::PARAM_STR,128);
$stmt->bindParam(3, $V_TABNAME, PDO::PARAM_STR,100);
$stmt->bindParam(4, $out_rc, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,12);
$stmt->bindParam(5, $out_err_message, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,100);
$stmt->bindParam(6, $out_sqlstate, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,6);
$stmt->bindParam(7, $out_sqlcode, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,12);
MySQL will return an error if a named placeholder has a hyphen in it:
UPDATE wardrobe SET `T-Shirt`=:T-SHIRT WHERE />
Will return the following error: PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: parameter was not defined’
To resolve, just remove hyphens from named placeholders:
UPDATE wardrobe SET `T-Shirt`=:TSHIRT WHERE >
if you are storing files (or binary data), using PARAM_LOB (and moreover trying to do this with Oracle), don’t miss this page :
You will there notice that PDO-PGSQL and PDO-OCI don’t work the same at all : not the same argument nor the same behaviour.
Как вставить переменную PHP в запрос SQL
Это получает имя и фамилию из таблицы, называемой пользователями, и объединяет их вместе, помещая пространство посередине и ставит в порядке возрастания.
Затем я помещаю это в массив и прокручиваю его, чтобы использовать его в раскрывающемся списке выбора.
Это работает, однако, то, что я сейчас хочу сделать, это сравнить полное имя с столбцом с именем username в другой таблице, называемой пользователем.
Я изо всех сил пытаюсь написать запрос. Пока у меня есть.
Где $ connection — ваше текущее соединение db
Вы действительно должны ссылаться на использование PDO. При использовании PDO вы можете привязывать параметры к определенным частям вашего запроса. PDO также имеет встроенную защиту от SQL-инъекций, которая является большой мерой безопасности, с которой вам не придется иметь дело. Надеюсь, это ответит на ваш вопрос. См. Мой пример ниже.
Пример:
Если у вас есть другие вопросы о PDO, обратитесь к следующему:
Вы можете использовать эту конструкцию (без «AS fullname» и с апострофами вокруг переменной):
Но для лучшей безопасности (SQL-инъекция) вы должны использовать экранирование переменной. Например, эта конструкция, если вы используете базу данных MySQL:
Это может сработать, если вы используете PDO:
. но вы должны посмотреть на возможные уязвимости с помощью SQL-инъекций.
Не зная, какую библиотеку вы используете для подключения к базе данных MySQL, невозможно дать правильное представление о том, какой метод вы должны использовать для экранирования ввода пользователя. quote — метод PDO для экранирования, real-escape-string является эквивалентом для MySQLi