3

テーブルにデータを挿入する次の関数があります。

public static function insertSistema($name,$description,$created_at, $updated_at, $img_file_name, $img_content_type, $img_file_size, $img_updated_at, $visible, $description, $access_floors, $access_procedures, $access_datas, $access_histories, $access_incidences, $access_operations, $access_reports, $access_messagings)
{
    $conector = new Conexion("localhost","xrem_prueba");
    try
    {
        $con = $conector->Conectar();
        $con->exec('SET CHARACTER SET utf8');
        $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $consulta = $con->prepare("INSERT INTO systems (name, created_at, updated_at, img_file_name, img_content_type, img_file_size, img_updated_at, visible, description, access_floors, access_procedures, access_datas, access_histories, access_incidences, access_operations, access_reports, access_messagings ) VALUES (:name, :created_at, :updated_at, :img_file_name, :img_content_type, :img_file_size, :img_updated_at, :visible, :description, :access_floors, :access_procedures, :access_datas, :access_histories, :access_incidences, :access_operations, :access_reports, :access_messagings);");
        $consulta->bindParam(':name', $name, PDO::PARAM_STR, 57);
        $consulta->bindParam(':description', $description, PDO::PARAM_STR);
        $consulta->bindParam(':created_at', $created_at, PDO::PARAM_STR);
        $consulta->bindParam(':updated_at', $updated_at, PDO::PARAM_STR);
        $consulta->bindParam(':img_file_name', $img_file_name, PDO::PARAM_STR,255);
        $consulta->bindParam(':img_content_type', $img_content_type, PDO::PARAM_STR,255);
        $consulta->bindParam(':img_file_size', $img_file_size, PDO::PARAM_INT);
        $consulta->bindParam(':img_updated_at', $img_updated_at, PDO::PARAM_INT);
        $consulta->bindParam(':visible', $visible, PDO::PARAM_INT,1);
        $consulta->bindParam(':access_floors', $access_floors, PDO::PARAM_INT,1);
        $consulta->bindParam(':access_procedures', $access_procedures, PDO::PARAM_INT,1);
        $consulta->bindParam(':access_datas', $access_procedures, PDO::PARAM_INT,1);
        $consulta->bindParam(':access_histories', $access_procedures, PDO::PARAM_INT,1);
        $consulta->bindParam(':access_incidences', $access_procedures, PDO::PARAM_INT,1);
        $consulta->bindParam(':access_operations', $access_procedures, PDO::PARAM_INT,1);
        $consulta->bindParam(':access_reports', $access_reports, PDO::PARAM_INT,1);
        $consulta->bindParam(':access_messagings', $access_messagings, PDO::PARAM_INT,1);
        $datos = array('name'=>$name,
                       'description'=>$description,
                       'created_at'=>$created_at,
                       'updated_at'=>$updated_at,
                       'img_file_name'=>$img_file_name,
                       'img_content_type'=>$img_content_type,
                       'img_file_size'=>$img_file_size,
                       'img_updated_at'=>$img_updated_at,
                       'visible'=>$visible,
                       'access_floors'=>$access_floors,
                       'access_procedures'=>$access_procedures,
                       'access_datas'=>$access_datas,
                       'access_histories'=>$access_histories,
                       'access_incidences'=>$access_incidences,
                       'access_operations'=>$access_operations,
                       'access_reports'=>$access_reports,
                       'access_messagings'=>$access_messagings
        );
        $consulta->execute($datos);
        $conector = null;
        $con = null;
        return $consulta;
    }
    catch (Exception $e)
    {
        $conector = null;
        $con = null;
        throw $e;
    }
}

ご覧のとおり、この$consulta->bindParam(':name', $name, PDO::PARAM_STR, 57);行 10: bindParamオプションがあり、57 文字の長さを切り捨てることを想定していますが、あらゆる種類の文字が挿入されるため、切り捨てられません。

4

2 に答える 2

6

長さパラメーターは切り捨てには使用されません。パラメータがストアド プロシージャから取得された場合にのみ使用し、長さを設定するのではなく、長さを伝えるために使用します。$name代わりに、変数をバインドする前に変数を切り捨てる必要があります。

PHPマニュアルから:「データ型の長さ。パラメータがストアドプロシージャからのOUTパラメータであることを示すには、長さを明示的に設定する必要があります。」

于 2013-06-17T11:43:13.190 に答える
1

どうやってやったの

public static function insertSistema($name,$description,$created_at, $updated_at, $img_file_name, $img_content_type, $img_file_size, $img_updated_at, $visible, $description, $access_floors, $access_procedures, $access_datas, $access_histories, $access_incidences, $access_operations, $access_reports, $access_messagings)
{
    global $con;
    $data   = func_get_args();
    $qmarks = str_repeat('?,', count($data) - 1) . '?';
    $stmt   = $con->prepare("INSERT INTO systems VALUES (NULL,$qmarks");
    $stmt->execute($data);
}

そしてはい - 私はその長くて風通しの良いパラメータリストも取り除き、それを配列に交換します

于 2013-06-17T11:57:33.713 に答える