08escape.phpt 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. --TEST--
  2. PostgreSQL escape functions
  3. --EXTENSIONS--
  4. pgsql
  5. --SKIPIF--
  6. <?php include("skipif.inc"); ?>
  7. --FILE--
  8. <?php
  9. include 'config.inc';
  10. define('FILE_NAME', __DIR__ . '/php.gif');
  11. // pg_escape_string() test
  12. $before = "ABC\\ABC\'";
  13. $expect = "ABC\\\\ABC\\'";
  14. $expect2 = "ABC\\\\ABC\\\\''"; //the way escape string differs from PostgreSQL 9.0
  15. $after = pg_escape_string($before);
  16. if ($expect === $after || $expect2 === $after) {
  17. echo "pg_escape_string() is Ok\n";
  18. }
  19. else {
  20. echo "pg_escape_string() is NOT Ok\n";
  21. var_dump($before);
  22. var_dump($after);
  23. var_dump($expect);
  24. }
  25. // pg_escape_bytea() test
  26. $before = "ABC\\ABC";
  27. $expect = "ABC\\\\\\\\ABC";
  28. $after = pg_escape_bytea($before);
  29. if ($expect === $after) {
  30. echo "pg_escape_bytea() is Ok\n";
  31. }
  32. else {
  33. echo "pg_escape_byte() is NOT Ok\n";
  34. var_dump($before);
  35. var_dump($after);
  36. var_dump($expect);
  37. }
  38. // Test using database
  39. $data = file_get_contents(FILE_NAME);
  40. $db = pg_connect($conn_str);
  41. // Insert binary to DB
  42. $escaped_data = pg_escape_bytea($db, $data);
  43. pg_query($db, "DELETE FROM ".$table_name." WHERE num = 10000;");
  44. $sql = "INSERT INTO ".$table_name." (num, bin) VALUES (10000, CAST ('".$escaped_data."' AS BYTEA));";
  45. pg_query($db, $sql);
  46. // Retrieve binary from DB
  47. for ($i = 0; $i < 2; $i++) {
  48. $sql = "SELECT bin::bytea FROM ".$table_name." WHERE num = 10000";
  49. $result = pg_query($db, $sql);
  50. $row = pg_fetch_array($result, 0, PGSQL_ASSOC);
  51. if ($data === pg_unescape_bytea($row['bin'])) {
  52. echo "pg_escape_bytea() actually works with database\n";
  53. break;
  54. }
  55. elseif (!$i) {
  56. // Force bytea escaping and retry
  57. @pg_query($db, "SET bytea_output = 'escape'");
  58. }
  59. else {
  60. $result = pg_query($db, $sql);
  61. echo "pg_escape_bytea() is broken\n";
  62. break;
  63. }
  64. }
  65. // pg_escape_literal/pg_escape_identifier
  66. $before = "ABC\\ABC\'";
  67. $expect = " E'ABC\\\\ABC\\\\'''";
  68. $after = pg_escape_literal($db, $before);
  69. if ($expect === $after) {
  70. echo "pg_escape_literal() is Ok\n";
  71. }
  72. else {
  73. echo "pg_escape_literal() is NOT Ok\n";
  74. var_dump($before);
  75. var_dump($after);
  76. var_dump($expect);
  77. }
  78. $before = "ABC\\ABC\'";
  79. $expect = "\"ABC\ABC\'\"";
  80. $after = pg_escape_identifier($db, $before);
  81. if ($expect === $after) {
  82. echo "pg_escape_identifier() is Ok\n";
  83. }
  84. else {
  85. echo "pg_escape_identifier() is NOT Ok\n";
  86. var_dump($before);
  87. var_dump($after);
  88. var_dump($expect);
  89. }
  90. ?>
  91. --EXPECTF--
  92. Deprecated: pg_escape_string(): Automatic fetching of PostgreSQL connection is deprecated in %s on line %d
  93. pg_escape_string() is Ok
  94. Deprecated: pg_escape_bytea(): Automatic fetching of PostgreSQL connection is deprecated in %s on line %d
  95. pg_escape_bytea() is Ok
  96. pg_escape_bytea() actually works with database
  97. pg_escape_literal() is Ok
  98. pg_escape_identifier() is Ok