PDO :: exec () o PDO :: query ()?

Solía ​​tener esto como una de las opciones (4to parámetro) pasada al constructor de PDO:

$aOptions[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8"; 

Pero acaba de descubrir que no funciona en ciertas versiones de php en Windows (no funciona en 5.3) debido a algún error.

Ahora necesito ejecutar SET NAMES utf8 utilizando $pdo->exec("SET NAMES utf8");

o $pdo->query("SET NAMES utf8");

justo después de la instancia del objeto pdo. Entonces, ¿cuál debería usar – exec () o query ()?

Solutions Collecting From Web of "PDO :: exec () o PDO :: query ()?"

Al utilizar PDO::EXEC el resultado devuelto no es de una PDOStatement sino un número entero de las filas afectadas.

Al usar PDO::QUERY el resultado devuelto es un PDOStatement .

Entonces la respuesta es que depende de lo que necesite hacer con los datos, si necesita ejecutar una consulta y no hacer nada con los resultados, entonces debe usar exec para ejecutar la consulta; de lo contrario, si necesita el número de filas, el datos devueltos, debe usar pdo::query y luego usar los resultados devueltos por la llamada.


en lo que respecta al error hay varios trabajos que puedes tomar

  • Instalar PDO_MYSQL
  • Reemplace MYSQL_ATTR_INIT_COMMAND con 1002
  • Actualice su PHP a la última versión estable donde se aprobó y parcheó.

el segundo problema puede tener algunos problemas en el sistema operativo de 64 bits y algunas configuraciones de Windows.

Información sobre errores : http://bugs.php.net/bug.php?id=47224

PDO :: exec () se debe usar para consultas que no devuelven un conjunto de resultados, como una statement de eliminación o ‘conjunto’. PDO :: query () debe usarse cuando espere que se devuelva un conjunto de resultados. Devuelve un objeto PDOStatement al que puede iterar para obtener las filas individuales. Sin embargo, tenga en cuenta que si utiliza datos de una fuente que no es de confianza en sus consultas, las declaraciones preparadas serían la mejor manera de realizar cualquier tipo de consulta (pero es probable que lo supiera).

Entonces, en su caso, PDO :: exec () estaría en lo cierto. ¿Estás seguro de que pasar el comando set names a PDO :: __ construct () ya que el último valor no funciona? Funciona para mí y tengo PHP 5.3 en Windows. ¿Podría publicar un código de muestra más de lo que está haciendo?